﻿local inittime, initmem, initgc = GetTime(), gcinfo()

Warmup = {
--	gcalerts = true,

	myname = "!!Warmup",

	inittime = inittime,
	initmem = initmem,
	initgc = initgc,

	lasttime = inittime,
	lastmem = initmem,
	lastgc = initgc,

	longesttime = 0,
	biggestmem = 0,
	totalmem = 0,

	timethresh = 1.0,
	timethresh2 = 0.5,
	timethresh3 = 0.1,

	memthresh = 1000,
	memthresh2 = 500,
	memthresh3 = 100,

	green = "|cff80ff80",
	yellow = "|cffffff80",
	orange = "|cffff8000",
	red = "|cffff0000",
}
inittime, initmem, initgc = nil, nil, nil


function Warmup:PutOut(txt, color, time, mem)
	local outstr = ((not time) and string.format("%s%s (%d KiB)", color, txt, mem))
		or (not mem and string.format("%.3f sec | %s%s", time, color, txt))
		or string.format("%.3f sec | %s%s (%d KiB)", time, color, txt, mem)

	self.frame:AddMessage(outstr)
	self.myframe:AddMessage(outstr)
end


function Warmup:PutOutAO(ao)
	local gc = (ao.gc and " |cffff80ff-GC-") or ""
	local tc = (ao.time >= Warmup.timethresh and self.red) or (ao.time >= Warmup.timethresh2 and self.orange) or (ao.time >= Warmup.timethresh3 and self.yellow) or self.green
	local mc = (ao.mem >= Warmup.memthresh and self.red) or (ao.mem >= Warmup.memthresh2 and self.orange) or (ao.mem >= Warmup.memthresh3 and self.yellow) or self.green
	local outstr = string.format("%s%.3f sec|r | %s (%s%d KiB|r)%s", tc, ao.time, ao.name, mc, ao.mem, gc)

	self.myframe:AddMessage(outstr)
end


function Warmup:OnLoad()
	tinsert(UISpecialFrames,"WarmupOutputFrame")

	this:RegisterEvent("VARIABLES_LOADED")
	this:RegisterEvent("ADDON_LOADED")

	self.WoW_ReloadUI = ReloadUI
	ReloadUI = function ()
		Warmup.reloading = true
		Warmup.WoW_ReloadUI()
	end

	self.WoW_LoadAddOn = LoadAddOn
	LoadAddOn = function (addon)
		Warmup.lasttime = GetTime()
		Warmup.lastmem, Warmup.lastgc = gcinfo()
		return Warmup.WoW_LoadAddOn(addon)
	end

	self:SetEventTable()
	for i,ev in pairs(self.events) do this:RegisterEvent(ev) end

	self.eventvals = {}
end


function Warmup:Init()
	if not WarmupSV then WarmupSV = {} end
	self.sv = WarmupSV
	self.sv.addoninfo = {}

	self.myframe = getglobal("WarmupChatFrame")
	self.frame = getglobal("ChatFrame2")
	for i=1,GetNumAddOns() do
		if IsAddOnLoaded(i) then
			if GetAddOnInfo(i) ~= self.myname then
				self.frame:AddMessage("Addon loaded before Warmup: ".. GetAddOnInfo(i))
				self.myframe:AddMessage("Addon loaded before Warmup: ".. GetAddOnInfo(i))
			end
		end
	end

	self.myframe:SetScript("OnMouseWheel", function ()
		if arg1 > 0 then this:ScrollUp()
		elseif arg1 < 0 then
			if IsShiftKeyDown() then this:ScrollToBottom()
			else this:ScrollDown() end
		end
	end)
	self.myframe:EnableMouseWheel(1)

end


function Warmup:OnUpdate()
	if self.gcalerts then
		local mem, gc = gcinfo()

		if (Warmup.gc and gc ~= Warmup.gc) then
			local outstr = string.format("GC fired | mem %d --> %d | threshold %d --> %d", Warmup.mem, mem, Warmup.gc, gc)
			Warmup.frame:AddMessage(outstr)
			self.myframe:AddMessage(outstr)
		end

		self.mem, self.gc = mem, gc
	end
end


function Warmup:DumpEvents()
	local sortt = {}
	for ev,val in pairs(self.eventvals) do table.insert(sortt, ev) end

	table.sort(sortt, function (a,b) return a<b end)

	for i,ev in pairs(sortt) do
		self.myframe:AddMessage(string.format(self.red.."%d|r | %s%s|r", Warmup.eventvals[ev], self.green, ev))
	end
end


function Warmup:OnEvent()
	if self.eventvals then self.eventvals[event] = (self.eventvals[event] or 0) + 1 end

	if (event == "ADDON_LOADED") then self:ADDON_LOADED()
	elseif (event == "VARIABLES_LOADED") then self:VARIABLES_LOADED()
	elseif (event == "PLAYER_LOGIN") then self:PLAYER_LOGIN()
	elseif (event == "PLAYER_ENTERING_WORLD") then self:PLAYER_ENTERING_WORLD()
	elseif (event == "PLAYER_LEAVING_WORLD") then self:PLAYER_LEAVING_WORLD()
	elseif (event == "PLAYER_LOGOUT") then self:PLAYER_LOGOUT() end
end


function Warmup:ADDON_LOADED()
	local addontime, addonmem, addongc = GetTime(), gcinfo()
	local diff = addonmem - self.lastmem
	local hadgc

	if not self.myframe then self:Init() end

	local aoinfo = {
		name = arg1,
		time = addontime - self.lasttime,
		mem = addonmem - self.lastmem,
	}

	-- When LUA performs a GC it sets the new threshold to the new memory use * 1.25
	-- so we can figure out how much memory was freed!

	if addongc ~= self.lastgc then
		diff = addonmem - (addongc/1.25) + self.lastgc - self.lastmem
		hadgc = true
		aoinfo.mem = addonmem - (addongc/1.25) + self.lastgc - self.lastmem;
		aoinfo.gc = true
	end

	self:PutOutAO(aoinfo)
	table.insert(self.sv.addoninfo, aoinfo)

	if (addontime - self.lasttime) > self.longesttime then
		self.longesttime = addontime - Warmup.lasttime
		self.longestaddon = arg1
	end
	if (diff) > self.biggestmem then
		self.biggestmem = diff
		self.biggestaddon = arg1
	end
	self.totalmem = Warmup.totalmem + diff
	self.lasttime, self.lastmem, self.lastgc = addontime, addonmem, addongc
end


function Warmup:VARIABLES_LOADED()
	self.varsloadtime = GetTime()
	if self.sv.time then
		self:PutOut("ReloadUI", self.green, self.inittime - self.sv.time)
	end
	self:PutOut("Addon Loadup", self.green, self.varsloadtime - self.inittime, self.lastmem - self.initmem)

	self:PutOut("Longest addon: ".. self.longestaddon, self.yellow, self.longesttime)
	self:PutOut("Biggest addon: ".. self.biggestaddon, self.yellow, nil, self.biggestmem)

	this:RegisterEvent("PLAYER_LOGIN")
	this:UnregisterEvent("VARIABLES_LOADED")

	SlashCmdList["RELOADTIME"] = function() ReloadUI() end
	SLASH_RELOADTIME1 = "/rlt"

	SlashCmdList["WARMUP"] = function (msg) Warmup:Slash(msg) end
	SLASH_WARMUP1 = "/wu"
	SLASH_WARMUP2 = "/warmup"
end


function Warmup:PLAYER_LOGIN()
	self.logging = true
	this:RegisterEvent("PLAYER_ENTERING_WORLD")
end


function Warmup:PLAYER_ENTERING_WORLD()
	if self.inittime and self.logging then
		local entrytime = GetTime()

		self:PutOut("World entry", self.green, entrytime - self.varsloadtime)

		if self.sv.time then self:PutOut("Total time", self.green, entrytime - self.sv.time)
		else self:PutOut("Total time", self.green, entrytime - Warmup.inittime) end

		self.sv.time = nil
		self.varsloadtime = nil
	elseif self.sv.time then
		self:PutOut("Zoning", self.green, GetTime() - self.sv.time)
		self.sv.time = nil
	end
	self.logging = nil
	this:UnregisterEvent("PLAYER_LOGIN")
	this:UnregisterEvent("PLAYER_LOGOUT")
	this:UnregisterEvent("PLAYER_ENTERING_WORLD")
	this:RegisterEvent("PLAYER_LEAVING_WORLD")

	for i,ev in pairs(Warmup.events) do this:UnregisterEvent(ev) end

	self:DumpEvents()
	self.events = nil
	self.eventvals = nil
end


function Warmup:PLAYER_LEAVING_WORLD()
	self.sv.time = GetTime()
	this:RegisterEvent("PLAYER_ENTERING_WORLD")
	this:RegisterEvent("PLAYER_LOGOUT")
	this:UnregisterEvent("PLAYER_LEAVING_WORLD")

	self:SetEventTable()

	for i,ev in pairs(Warmup.events) do this:RegisterEvent(ev) end

	self.eventvals = {}
end


function Warmup:PLAYER_LOGOUT()
	if not self.reloading then self.sv.time = nil end
end




function Warmup:Slash(msg)
	if (WarmupOutputFrame:IsVisible()) then WarmupOutputFrame:Hide()
	else WarmupOutputFrame:Show() end
end


function Warmup:SetEventTable()
	self.events = {
		"ACTIONBAR_HIDEGRID",
		"ACTIONBAR_PAGE_CHANGED",
		"ACTIONBAR_SHOWGRID",
		"ACTIONBAR_SLOT_CHANGED",
		"ACTIONBAR_UPDATE_COOLDOWN",
		"ACTIONBAR_UPDATE_STATE",
		"ACTIONBAR_UPDATE_USABLE",
		"AREA_SPIRIT_HEALER_IN_RANGE",
		"AREA_SPIRIT_HEALER_OUT_OF_RANGE",
		"AUCTION_BIDDER_LIST_UPDATE",
		"AUCTION_HOUSE_CLOSED",
		"AUCTION_HOUSE_SHOW",
		"AUCTION_ITEM_LIST_UPDATE",
		"AUCTION_OWNED_LIST_UPDATE",
		"AUTOEQUIP_BIND_CONFIRM",
		"AUTOFOLLOW_BEGIN",
		"AUTOFOLLOW_END",
		"BAG_CLOSED",
		"BAG_OPEN",
		"BAG_UPDATE",
		"BAG_UPDATE_COOLDOWN",
		"BANKFRAME_CLOSED",
		"BANKFRAME_OPENED",
		"BATTLEFIELDS_CLOSED",
		"BATTLEFIELDS_SHOW",
		"BILLING_NAG_DIALOG",
		"BIND_ENCHANT",
		"CANCEL_LOOT_ROLL",
		"CHARACTER_LIST_UPDATE",
		"CHARACTER_POINTS_CHANGED",
		"CHAT_MSG",
		"CHAT_MSG_AFK",
		"CHAT_MSG_BG_SYSTEM_ALLIANCE",
		"CHAT_MSG_BG_SYSTEM_HORDE",
		"CHAT_MSG_BG_SYSTEM_NEUTRAL",
		"CHAT_MSG_CHANNEL",
		"CHAT_MSG_CHANNEL_JOIN",
		"CHAT_MSG_CHANNEL_LEAVE",
		"CHAT_MSG_CHANNEL_LIST",
		"CHAT_MSG_CHANNEL_NOTICE",
		"CHAT_MSG_CHANNEL_NOTICE_USER",
		"CHAT_MSG_COMBAT_CREATURE_VS_CREATURE_HITS",
		"CHAT_MSG_COMBAT_CREATURE_VS_CREATURE_MISSES",
		"CHAT_MSG_COMBAT_CREATURE_VS_PARTY_HITS",
		"CHAT_MSG_COMBAT_CREATURE_VS_PARTY_MISSES",
		"CHAT_MSG_COMBAT_CREATURE_VS_SELF_HITS",
		"CHAT_MSG_COMBAT_CREATURE_VS_SELF_MISSES",
		"CHAT_MSG_COMBAT_ERROR",
		"CHAT_MSG_COMBAT_FRIENDLYPLAYER_HITS",
		"CHAT_MSG_COMBAT_FRIENDLYPLAYER_MISSES",
		"CHAT_MSG_COMBAT_FRIENDLY_DEATH",
		"CHAT_MSG_COMBAT_HONOR_GAIN",
		"CHAT_MSG_COMBAT_HOSTILEPLAYER_HITS",
		"CHAT_MSG_COMBAT_HOSTILEPLAYER_MISSES",
		"CHAT_MSG_COMBAT_HOSTILE_DEATH",
		"CHAT_MSG_COMBAT_MISC_INFO",
		"CHAT_MSG_COMBAT_PARTY_HITS",
		"CHAT_MSG_COMBAT_PARTY_MISSES",
		"CHAT_MSG_COMBAT_PET_HITS",
		"CHAT_MSG_COMBAT_PET_MISSES",
		"CHAT_MSG_COMBAT_SELF_HITS",
		"CHAT_MSG_COMBAT_SELF_MISSES",
		"CHAT_MSG_COMBAT_XP_GAIN",
		"CHAT_MSG_DND",
		"CHAT_MSG_EMOTE",
		"CHAT_MSG_GUILD",
		"CHAT_MSG_IGNORED",
		"CHAT_MSG_LOOT",
		"CHAT_MSG_MONSTER_EMOTE",
		"CHAT_MSG_MONSTER_SAY",
		"CHAT_MSG_MONSTER_WHISPER",
		"CHAT_MSG_MONSTER_YELL",
		"CHAT_MSG_OFFICER",
		"CHAT_MSG_PARTY",
		"CHAT_MSG_RAID",
		"CHAT_MSG_SAY",
		"CHAT_MSG_SKILL",
		"CHAT_MSG_SPELL_AURA_GONE_OTHER",
		"CHAT_MSG_SPELL_AURA_GONE_SELF",
		"CHAT_MSG_SPELL_BREAK_AURA",
		"CHAT_MSG_SPELL_CREATURE_VS_CREATURE_BUFF",
		"CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE",
		"CHAT_MSG_SPELL_CREATURE_VS_PARTY_BUFF",
		"CHAT_MSG_SPELL_CREATURE_VS_PARTY_DAMAGE",
		"CHAT_MSG_SPELL_CREATURE_VS_SELF_BUFF",
		"CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE",
		"CHAT_MSG_SPELL_DAMAGESHIELDS_ON_OTHERS",
		"CHAT_MSG_SPELL_DAMAGESHIELDS_ON_SELF",
		"CHAT_MSG_SPELL_FAILED_LOCALPLAYER",
		"CHAT_MSG_SPELL_FRIENDLYPLAYER_BUFF",
		"CHAT_MSG_SPELL_FRIENDLYPLAYER_DAMAGE",
		"CHAT_MSG_SPELL_HOSTILEPLAYER_BUFF",
		"CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE",
		"CHAT_MSG_SPELL_ITEM_ENCHANTMENTS",
		"CHAT_MSG_SPELL_PARTY_BUFF",
		"CHAT_MSG_SPELL_PARTY_DAMAGE",
		"CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS",
		"CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE",
		"CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_BUFFS",
		"CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_DAMAGE",
		"CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_BUFFS",
		"CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE",
		"CHAT_MSG_SPELL_PERIODIC_PARTY_BUFFS",
		"CHAT_MSG_SPELL_PERIODIC_PARTY_DAMAGE",
		"CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS",
		"CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE",
		"CHAT_MSG_SPELL_PET_BUFF",
		"CHAT_MSG_SPELL_PET_DAMAGE",
		"CHAT_MSG_SPELL_SELF_BUFF",
		"CHAT_MSG_SPELL_SELF_DAMAGE",
		"CHAT_MSG_SPELL_TRADESKILLS",
		"CHAT_MSG_SYSTEM",
		"CHAT_MSG_TEXT_EMOTE",
		"CHAT_MSG_WHISPER",
		"CHAT_MSG_WHISPER_INFORM",
		"CHAT_MSG_YELL",
		"CINEMATIC_START",
		"CINEMATIC_STOP",
		"CLEAR_TOOLTIP",
		"CLOSE_INBOX_ITEM",
		"CLOSE_TABARD_FRAME",
		"CLOSE_WORLD_MAP",
		"CONFIRM_BINDER",
		"CONFIRM_LOOT_ROLL",
		"CONFIRM_PET_UNLEARN",
		"CONFIRM_SUMMON",
		"CONFIRM_TALENT_WIPE",
		"CONFIRM_XP_LOSS",
		"CORPSE_IN_INSTANCE",
		"CORPSE_IN_RANGE",
		"CORPSE_OUT_OF_RANGE",
		"CRAFT_CLOSE",
		"CRAFT_SHOW",
		"CRAFT_UPDATE",
		"CURRENT_SPELL_CAST_CHANGED",
		"CURSOR_UPDATE",
		"CVAR_UPDATE",
		"DELETE_ITEM_CONFIRM",
		"DISPLAY_SIZE_CHANGED",
		"DUEL_FINISHED",
		"DUEL_INBOUNDS",
		"DUEL_OUTOFBOUNDS",
		"DUEL_REQUESTED",
		"EQUIP_BIND_CONFIRM",
		"EXECUTE_CHAT_LINE",
		"FRIENDLIST_SHOW",
		"FRIENDLIST_UPDATE",
		"GOSSIP_CLOSED",
		"GOSSIP_ENTER_CODE",
		"GOSSIP_SHOW",
		"GUILD_INVITE_CANCEL",
		"GUILD_INVITE_REQUEST",
		"GUILD_MOTD",
		"GUILD_REGISTRAR_CLOSED",
		"GUILD_REGISTRAR_SHOW",
		"GUILD_ROSTER_SHOW",
		"GUILD_ROSTER_UPDATE",
		"IGNORELIST_UPDATE",
		"IGR_BILLING_NAG_DIALOG",
		"INSTANCE_BOOT_START",
		"INSTANCE_BOOT_STOP",
		"ITEM_LOCK_CHANGED",
		"ITEM_PUSH",
		"ITEM_TEXT_BEGIN",
		"ITEM_TEXT_CLOSED",
		"ITEM_TEXT_READY",
		"ITEM_TEXT_TRANSLATION",
		"LANGUAGE_LIST_CHANGED",
		"LEARNED_SPELL_IN_TAB",
		"LOCALPLAYER_PET_RENAMED",
		"LOGOUT_CANCEL",
		"LOOT_BIND_CONFIRM",
		"LOOT_CLOSED",
		"LOOT_OPENED",
		"LOOT_SLOT_CLEARED",
		"MAIL_CLOSED",
		"MAIL_FAILED",
		"MAIL_INBOX_UPDATE",
		"MAIL_SEND_INFO_UPDATE",
		"MAIL_SEND_SUCCESS",
		"MAIL_SHOW",
		"MEETINGSTONE_CHANGED",
		"MEMORY_EXHAUSTED",
		"MEMORY_RECOVERED",
		"MERCHANT_CLOSED",
		"MERCHANT_SHOW",
		"MERCHANT_UPDATE",
		"MINIMAP_PING",
		"MINIMAP_UPDATE_ZOOM",
		"MINIMAP_ZONE_CHANGED",
		"MIRROR_TIMER_PAUSE",
		"MIRROR_TIMER_START",
		"MIRROR_TIMER_STOP",
		"NEW_AUCTION_UPDATE",
		"OPEN_MASTER_LOOT_LIST",
		"OPEN_TABARD_FRAME",
		"PARTY_INVITE_CANCEL",
		"PARTY_INVITE_REQUEST",
		"PARTY_LEADER_CHANGED",
		"PARTY_LOOT_METHOD_CHANGED",
		"PARTY_MEMBERS_CHANGED",
		"PARTY_MEMBER_DISABLE",
		"PARTY_MEMBER_ENABLE",
		"PETITION_CLOSED",
		"PETITION_SHOW",
		"PET_ATTACK_START",
		"PET_ATTACK_STOP",
		"PET_BAR_HIDEGRID",
		"PET_BAR_SHOWGRID",
		"PET_BAR_UPDATE",
		"PET_BAR_UPDATE_COOLDOWN",
		"PET_STABLE_CLOSED",
		"PET_STABLE_SHOW",
		"PET_STABLE_UPDATE",
		"PET_STABLE_UPDATE_PAPERDOLL",
		"PET_UI_CLOSE",
		"PET_UI_UPDATE",
		"PLAYERBANKBAGSLOTS_CHANGED",
		"PLAYERBANKSLOTS_CHANGED",
		"PLAYER_ALIVE",
		"PLAYER_AURAS_CHANGED",
		"PLAYER_CAMPING",
		"PLAYER_COMBO_POINTS",
		"PLAYER_CONTROL_GAINED",
		"PLAYER_CONTROL_LOST",
		"PLAYER_DAMAGE_DONE_MODS",
		"PLAYER_DEAD",
		"PLAYER_FARSIGHT_FOCUS_CHANGED",
		"PLAYER_ENTER_COMBAT",
		"PLAYER_FLAGS_CHANGED",
		"PLAYER_GUILD_UPDATE",
		"PLAYER_LEAVE_COMBAT",
		"PLAYER_LEVEL_UP",
		"PLAYER_LOGIN",
		"PLAYER_LOGOUT",
		"PLAYER_MONEY",
		"PLAYER_PET_CHANGED",
		"PLAYER_PVP_KILLS_CHANGED",
		"PLAYER_PVP_RANK_CHANGED",
		"PLAYER_PVPLEVEL_CHANGED",
		"PLAYER_QUITING",
		"PLAYER_REGEN_DISABLED",
		"PLAYER_REGEN_ENABLED",
		"PLAYER_SKINNED",
		"PLAYER_TARGET_CHANGED",
		"PLAYER_TRADE_MONEY",
		"PLAYER_UNGHOST",
		"PLAYER_UPDATE_RESTING",
		"PLAYER_XP_UPDATE",
		"PLAYTIME_CHANGED",
		"QUEST_ACCEPT_CONFIRM",
		"QUEST_COMPLETE",
		"QUEST_DETAIL",
		"QUEST_FINISHED",
		"QUEST_GREETING",
		"QUEST_ITEM_UPDATE",
		"QUEST_LOG_UPDATE",
		"QUEST_PROGRESS",
		"RAID_ROSTER_UPDATE",
		"REPLACE_ENCHANT",
		"RESURRECT_REQUEST",
		"SCREENSHOT_FAILED",
		"SCREENSHOT_SUCCEEDED",
		"SELECT_FIRST_CHARACTER",
		"SELECT_LAST_CHARACTER",
		"SEND_MAIL_COD_CHANGED",
		"SEND_MAIL_MONEY_CHANGED",
		"SHOW_COMPARE_TOOLTIP",
		"SKILL_LINES_CHANGED",
		"SPELLCAST_CHANNEL_START",
		"SPELLCAST_CHANNEL_UPDATE",
		"SPELLCAST_DELAYED",
		"SPELLCAST_FAILED",
		"SPELLCAST_INTERRUPTED",
		"SPELLCAST_START",
		"SPELLCAST_STOP",
		"SPELLS_CHANGED",
		"SPELL_UPDATE_COOLDOWN",
		"SPELL_UPDATE_USABLE",
		"START_AUTOREPEAT_SPELL",
		"START_LOOT_ROLL",
		"STOP_AUTOREPEAT_SPELL",
		"SUGGEST_REALM",
		"SYSMSG",
		"TABARD_CANSAVE_CHANGED",
		"TABARD_SAVE_PENDING",
		"TAXIMAP_CLOSED",
		"TAXIMAP_OPENED",
		"TIME_PLAYED_MSG",
		"TOOLTIP_ADD_MONEY",
		"TOOLTIP_ANCHOR_DEFAULT",
		"TRADE_ACCEPT_UPDATE",
		"TRADE_CLOSED",
		"TRADE_MONEY_CHANGED",
		"TRADE_PLAYER_ITEM_CHANGED",
		"TRADE_REPLACE_ENCHANT",
		"TRADE_REQUEST",
		"TRADE_REQUEST_CANCEL",
		"TRADE_SHOW",
		"TRADE_SKILL_CLOSE",
		"TRADE_SKILL_SHOW",
		"TRADE_SKILL_UPDATE",
		"TRADE_TARGET_ITEM_CHANGED",
		"TRADE_UPDATE",
		"TRAINER_CLOSED",
		"TRAINER_SHOW",
		"TRAINER_UPDATE",
		"TUTORIAL_TRIGGER",
		"UI_ERROR_MESSAGE",
		"UI_INFO_MESSAGE",
		"UNIT_ATTACK",
		"UNIT_ATTACK_POWER",
		"UNIT_ATTACK_SPEED",
		"UNIT_AURA",
		"UNIT_AURASTATE",
		"UNIT_CLASSIFICATION_CHANGED",
		"UNIT_COMBAT",
		"UNIT_COMBO_POINTS",
		"UNIT_DAMAGE",
		"UNIT_DEFENSE",
		"UNIT_DISPLAYPOWER",
		"UNIT_DYNAMIC_FLAGS",
		"UNIT_ENERGY",
		"UNIT_FACTION",
		"UNIT_FLAGS",
		"UNIT_FOCUS",
		"UNIT_HAPPINESS",
		"UNIT_HEALTH",
		"UNIT_INVENTORY_CHANGED",
		"UNIT_LEVEL",
		"UNIT_LOYALTY",
		"UNIT_MANA",
		"UNIT_MAXENERGY",
		"UNIT_MAXFOCUS",
		"UNIT_MAXHAPPINESS",
		"UNIT_MAXHEALTH",
		"UNIT_MAXMANA",
		"UNIT_MAXRAGE",
		"UNIT_MODEL_CHANGED",
		"UNIT_NAME_UPDATE",
		"UNIT_PET",
		"UNIT_PET_EXPERIENCE",
		"UNIT_PET_TRAINING_POINTS",
		"UNIT_PORTRAIT_UPDATE",
		"UNIT_PVP_UPDATE",
		"UNIT_QUEST_LOG_CHANGED",
		"UNIT_RAGE",
		"UNIT_RANGEDDAMAGE",
		"UNIT_RANGED_ATTACK_POWER",
		"UNIT_RESISTANCES",
		"UNIT_SPELLMISS",
		"UNIT_STATS",
		"UPDATE_BATTLEFIELD_SCORE",
		"UPDATE_BATTLEFIELD_STATUS",
		"UPDATE_BINDINGS",
		"UPDATE_BONUS_ACTIONBAR",
		"UPDATE_CHAT_COLOR",
		"UPDATE_CHAT_WINDOWS",
		"UPDATE_EXHAUSTION",
		"UPDATE_FACTION",
		"UPDATE_GM_STATUS",
		"UPDATE_INVENTORY_ALERTS",
		"UPDATE_MACROS",
		"UPDATE_MASTER_LOOT_LIST",
		"UPDATE_MOUSEOVER_UNIT",
		"UPDATE_PENDING_MAIL",
		"UPDATE_SELECTED_CHARACTER",
		"UPDATE_SHAPESHIFT_FORMS",
		"UPDATE_TICKET",
		"UPDATE_TRADESKILL_RECAST",
		"UPDATE_WORLD_STATES",
		"USE_BIND_CONFIRM",
		"VARIABLES_LOADED",
		"WHO_LIST_UPDATE",
		"WORLD_MAP_NAME_UPDATE",
		"WORLD_MAP_UPDATE",
		"ZONE_CHANGED",
		"ZONE_CHANGED_INDOORS",
		"ZONE_CHANGED_NEW_AREA",
		"ZONE_UNDER_ATTACK",
	}
end
