-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

	local _detalhes = 		_G._detalhes
	local _tempo = time()

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--local pointers
	local _
	local pairs = pairs --lua local
	local ipairs = ipairs --lua local
	local rawget = rawget --lua local
	local setmetatable = setmetatable --lua local
	local _table_remove = table.remove --lua local
	local _bit_band = bit.band --lua local
	local wipe = table.wipe --lua local
	local _time = time --lua local

	local _InCombatLockdown = InCombatLockdown --wow api local

	local atributo_damage =	_detalhes.atributo_damage --details local
	local atributo_heal =		_detalhes.atributo_heal --details local
	local atributo_energy =		_detalhes.atributo_energy --details local
	local atributo_misc =		_detalhes.atributo_misc --details local
	local alvo_da_habilidade = 	_detalhes.alvo_da_habilidade --details local
	local habilidade_dano = 	_detalhes.habilidade_dano --details local
	local habilidade_cura = 		_detalhes.habilidade_cura --details local
	local container_habilidades = 	_detalhes.container_habilidades --details local
	local container_combatentes = _detalhes.container_combatentes --details local

	local container_damage_target = _detalhes.container_type.CONTAINER_DAMAGETARGET_CLASS

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--constants

	local class_type_dano = _detalhes.atributos.dano
	local class_type_cura = _detalhes.atributos.cura
	local class_type_e_energy = _detalhes.atributos.e_energy
	local class_type_misc = _detalhes.atributos.misc

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--core

	--reconstr�i o mapa do container
		local function ReconstroiMapa (tabela)
			local mapa = {}
			for i = 1, #tabela._ActorTable do
				mapa [tabela._ActorTable[i].nome] = i
			end
			tabela._NameIndexTable = mapa
		end

	--reaplica as tabelas no overall
		function _detalhes:RestauraOverallMetaTables()

			local is_in_instance = select(1, IsInInstance())

			local combate = _detalhes.tabela_overall
			combate.overall_refreshed = true
			combate.hasSaved = true

			combate.__call = _detalhes.call_combate

			_detalhes.refresh:r_combate (combate)

			_detalhes.refresh:r_container_combatentes (combate [class_type_dano])
			_detalhes.refresh:r_container_combatentes (combate [class_type_cura])
			_detalhes.refresh:r_container_combatentes (combate [class_type_e_energy])
			_detalhes.refresh:r_container_combatentes (combate [class_type_misc])

			_detalhes.refresh:r_container_combatentes (combate [5]) --ghost container

			local todos_atributos = {combate [class_type_dano]._ActorTable, combate [class_type_cura]._ActorTable, combate [class_type_e_energy]._ActorTable, combate [class_type_misc]._ActorTable}

			for class_type, atributo in ipairs(todos_atributos) do
				for _, esta_classe in ipairs(atributo) do

					local nome = esta_classe.nome

					if (is_in_instance and _detalhes.remove_realm_from_name) then
						esta_classe.displayName = nome:gsub(("%-.*"), "")
					elseif (_detalhes.remove_realm_from_name) then
						esta_classe.displayName = nome:gsub(("%-.*"), "") --"%*"
					else
						esta_classe.displayName = nome
					end

					if (class_type == class_type_dano) then
						_detalhes.refresh:r_atributo_damage (esta_classe)

					elseif (class_type == class_type_cura) then
						_detalhes.refresh:r_atributo_heal (esta_classe)

					elseif (class_type == class_type_e_energy) then
						_detalhes.refresh:r_atributo_energy (esta_classe)

					elseif (class_type == class_type_misc) then
						_detalhes.refresh:r_atributo_misc (esta_classe)

					end

				end
			end

			for class_type, atributo in ipairs(todos_atributos) do
				for _, esta_classe in ipairs(atributo) do
					if (esta_classe.ownerName) then --nome do owner
						esta_classe.owner = combate (class_type, esta_classe.ownerName)
					end
				end
			end

		end

	--reaplica indexes e metatables
		function _detalhes:RestauraMetaTables()

				_detalhes.refresh:r_atributo_custom()

			--container de pets e hist�rico
				_detalhes.refresh:r_container_pets (_detalhes.tabela_pets)
				_detalhes.refresh:r_historico (_detalhes.tabela_historico)

			--tabelas dos combates
				local combate_overall = _detalhes.tabela_overall
				local overall_dano = combate_overall [class_type_dano] --damage atalho
				local overall_cura = combate_overall [class_type_cura] --heal atalho
				local overall_energy = combate_overall [class_type_e_energy] --energy atalho
				local overall_misc = combate_overall [class_type_misc] --misc atalho

				local tabelas_do_historico = _detalhes.tabela_historico.tabelas --atalho

			--recupera meta function
				for _, combat_table in ipairs(tabelas_do_historico) do
					combat_table.__call = _detalhes.call_combate
				end

				for i = #tabelas_do_historico-1, 1, -1 do
					local combat = tabelas_do_historico [i]
					combat.previous_combat = tabelas_do_historico [i+1]
				end

			--tempo padrao do overall

				local overall_saved = combate_overall.overall_refreshed

				if (not overall_saved) then
					combate_overall.start_time = GetTime()
					combate_overall.end_time = GetTime()
				end

				local is_in_instance = select(1, IsInInstance())

			--inicia a recupera��o das tabelas e montagem do overall
				if (#tabelas_do_historico > 0) then
					for index, combate in ipairs(tabelas_do_historico) do

						combate.hasSaved = true

						--recupera a meta e indexes da tabela do combate
						_detalhes.refresh:r_combate (combate, combate_overall)

						--aumenta o tempo do combate do overall, seta as datas e os combates armazenados
						if (not overall_saved and combate.overall_added) then

							if (combate.end_time and combate.start_time) then
								combate_overall.start_time = combate_overall.start_time - (combate.end_time - combate.start_time)
							end
							--
							if (combate_overall.data_inicio == 0) then
								combate_overall.data_inicio = combate.data_inicio or 0
							end
							combate_overall.data_fim = combate.data_fim or combate_overall.data_fim
							--
							if (not _detalhes.tabela_overall.overall_enemy_name) then
								_detalhes.tabela_overall.overall_enemy_name = combate.is_boss and combate.is_boss.name or combate.enemy
							else
								if (_detalhes.tabela_overall.overall_enemy_name ~= (combate.is_boss and combate.is_boss.name or combate.enemy)) then
									_detalhes.tabela_overall.overall_enemy_name = "-- x -- x --"
								end
							end

							combate_overall.segments_added =combate_overall.segments_added or {}
							local date_start, date_end = combate:GetDate()
							tinsert(combate_overall.segments_added, {name = combate:GetCombatName(true), elapsed = combate:GetCombatTime(), clock = date_start})

						end

						--recupera a meta e indexes dos 4 container
						_detalhes.refresh:r_container_combatentes (combate [class_type_dano], overall_dano)
						_detalhes.refresh:r_container_combatentes (combate [class_type_cura], overall_cura)
						_detalhes.refresh:r_container_combatentes (combate [class_type_e_energy], overall_energy)
						_detalhes.refresh:r_container_combatentes (combate [class_type_misc], overall_misc)

						--ghost container
						if (combate[5]) then
							_detalhes.refresh:r_container_combatentes (combate [5], combate_overall [5])
						end

						--tabela com os 4 tabelas de jogadores
						local todos_atributos = {combate [class_type_dano]._ActorTable, combate [class_type_cura]._ActorTable, combate [class_type_e_energy]._ActorTable, combate [class_type_misc]._ActorTable}

						for class_type, atributo in ipairs(todos_atributos) do
							for _, esta_classe in ipairs(atributo) do

								local nome = esta_classe.nome

								if (is_in_instance and _detalhes.remove_realm_from_name) then
									esta_classe.displayName = nome:gsub(("%-.*"), "")
								elseif (_detalhes.remove_realm_from_name) then
									esta_classe.displayName = nome:gsub(("%-.*"), "") --%*
								else
									esta_classe.displayName = nome
								end

								local shadow

								if (class_type == class_type_dano) then
									if (combate.overall_added and not overall_saved) then
										shadow = atributo_damage:r_connect_shadow (esta_classe)
									else
										shadow = atributo_damage:r_onlyrefresh_shadow (esta_classe)
									end

								elseif (class_type == class_type_cura) then
									if (combate.overall_added and not overall_saved) then
										shadow = atributo_heal:r_connect_shadow (esta_classe)
									else
										shadow = atributo_heal:r_onlyrefresh_shadow (esta_classe)
									end

								elseif (class_type == class_type_e_energy) then
									if (combate.overall_added and not overall_saved) then
										shadow = atributo_energy:r_connect_shadow (esta_classe)
									else
										shadow = atributo_energy:r_onlyrefresh_shadow (esta_classe)
									end

								elseif (class_type == class_type_misc) then
									if (combate.overall_added and not overall_saved) then
										shadow = atributo_misc:r_connect_shadow (esta_classe)
									else
										shadow = atributo_misc:r_onlyrefresh_shadow (esta_classe)
									end
								end

							end
						end

						--reconstr�i a tabela dos pets
						for class_type, atributo in ipairs(todos_atributos) do
							for _, esta_classe in ipairs(atributo) do
								if (esta_classe.ownerName) then --nome do owner
									esta_classe.owner = combate (class_type, esta_classe.ownerName)
								end
							end
						end

					end
				--fim
				end

			--restaura last_events_table
				local primeiro_combate = tabelas_do_historico [1] --primeiro combate
				if (primeiro_combate) then
					primeiro_combate [1]:ActorCallFunction (atributo_damage.r_last_events_table)
					primeiro_combate [2]:ActorCallFunction (atributo_heal.r_last_events_table)
				end

				local segundo_combate = tabelas_do_historico [2] --segundo combate
				if (segundo_combate) then
					segundo_combate [1]:ActorCallFunction (atributo_damage.r_last_events_table)
					segundo_combate [2]:ActorCallFunction (atributo_heal.r_last_events_table)
				end

		end

	function _detalhes:DoInstanceCleanup()

		--normal instances
		for _, esta_instancia in ipairs(_detalhes.tabela_instancias) do

			if (esta_instancia.StatusBar.left) then
				esta_instancia.StatusBarSaved = {
					["left"] = esta_instancia.StatusBar.left.real_name or "NONE",
					["center"] = esta_instancia.StatusBar.center.real_name or "NONE",
					["right"] = esta_instancia.StatusBar.right.real_name or "NONE",
				}
				esta_instancia.StatusBarSaved.options = {
					[esta_instancia.StatusBarSaved.left] = esta_instancia.StatusBar.left.options,
					[esta_instancia.StatusBarSaved.center] = esta_instancia.StatusBar.center.options,
					[esta_instancia.StatusBarSaved.right] = esta_instancia.StatusBar.right.options
				}
			end

			--erase all widgets frames

			esta_instancia.scroll = nil
			esta_instancia.baseframe = nil
			esta_instancia.bgframe = nil
			esta_instancia.bgdisplay = nil
			esta_instancia.freeze_icon = nil
			esta_instancia.freeze_texto = nil
			esta_instancia.barras = nil
			esta_instancia.showing = nil
			esta_instancia.agrupada_a = nil
			esta_instancia.grupada_pos = nil
			esta_instancia.agrupado = nil
			esta_instancia._version = nil

			esta_instancia.h_baixo = nil
			esta_instancia.h_esquerda = nil
			esta_instancia.h_direita = nil
			esta_instancia.h_cima = nil
			esta_instancia.break_snap_button = nil
			esta_instancia.alert = nil

			esta_instancia.StatusBar = nil
			esta_instancia.consolidateFrame = nil
			esta_instancia.consolidateButtonTexture = nil
			esta_instancia.consolidateButton = nil
			esta_instancia.lastIcon = nil
			esta_instancia.firstIcon = nil

			esta_instancia.menu_attribute_string = nil

			esta_instancia.wait_for_plugin_created = nil
			esta_instancia.waiting_raid_plugin = nil
			esta_instancia.waiting_pid = nil

		end

		--unused instances
		for _, esta_instancia in ipairs(_detalhes.unused_instances) do

			if (esta_instancia.StatusBar.left) then
				esta_instancia.StatusBarSaved = {
					["left"] = esta_instancia.StatusBar.left.real_name or "NONE",
					["center"] = esta_instancia.StatusBar.center.real_name or "NONE",
					["right"] = esta_instancia.StatusBar.right.real_name or "NONE",
				}
				esta_instancia.StatusBarSaved.options = {
					[esta_instancia.StatusBarSaved.left] = esta_instancia.StatusBar.left.options,
					[esta_instancia.StatusBarSaved.center] = esta_instancia.StatusBar.center.options,
					[esta_instancia.StatusBarSaved.right] = esta_instancia.StatusBar.right.options
				}
			end

			--erase all widgets frames
			esta_instancia.scroll = nil
			esta_instancia.baseframe = nil
			esta_instancia.bgframe = nil
			esta_instancia.bgdisplay = nil
			esta_instancia.freeze_icon = nil
			esta_instancia.freeze_texto = nil
			esta_instancia.barras = nil
			esta_instancia.showing = nil
			esta_instancia.agrupada_a = nil
			esta_instancia.grupada_pos = nil
			esta_instancia.agrupado = nil
			esta_instancia._version = nil

			esta_instancia.h_baixo = nil
			esta_instancia.h_esquerda = nil
			esta_instancia.h_direita = nil
			esta_instancia.h_cima = nil
			esta_instancia.break_snap_button = nil
			esta_instancia.alert = nil

			esta_instancia.StatusBar = nil
			esta_instancia.consolidateFrame = nil
			esta_instancia.consolidateButtonTexture = nil
			esta_instancia.consolidateButton = nil
			esta_instancia.lastIcon = nil
			esta_instancia.firstIcon = nil

			esta_instancia.menu_attribute_string = nil

			esta_instancia.wait_for_plugin_created = nil
			esta_instancia.waiting_raid_plugin = nil
			esta_instancia.waiting_pid = nil
		end
	end

	function _detalhes:DoOwnerCleanup()
		local combats = _detalhes.tabela_historico.tabelas or {}
		local overall_added
		if (not _detalhes.overall_clear_logout) then
			tinsert(combats, _detalhes.tabela_overall)
			overall_added = true
		end

		for index, combat in ipairs(combats) do
			for index, container in ipairs(combat) do
				for index, esta_classe in ipairs(container._ActorTable) do
					esta_classe.owner = nil
				end
			end
		end

		if (overall_added) then
			tremove(combats, #combats)
		end
	end

	function _detalhes:DoClassesCleanup()
		local combats = _detalhes.tabela_historico.tabelas or {}
		local overall_added
		if (not _detalhes.overall_clear_logout) then
			tinsert(combats, _detalhes.tabela_overall)
			overall_added = true
		end

		for index, combat in ipairs(combats) do
			for class_type, container in ipairs(combat) do
				for index, esta_classe in ipairs(container._ActorTable) do

					esta_classe.displayName = nil
					esta_classe.minha_barra = nil

					if (class_type == class_type_dano) then
						_detalhes.clear:c_atributo_damage (esta_classe)
					elseif (class_type == class_type_cura) then
						_detalhes.clear:c_atributo_heal (esta_classe)
					elseif (class_type == class_type_e_energy) then
						_detalhes.clear:c_atributo_energy (esta_classe)
					elseif (class_type == class_type_misc) then
						_detalhes.clear:c_atributo_misc (esta_classe)
					end

				end
			end
		end

		if (overall_added) then
			tremove(combats, #combats)
		end
	end

	function _detalhes:DoContainerCleanup()
		local combats = _detalhes.tabela_historico.tabelas or {}
		local overall_added
		if (not _detalhes.overall_clear_logout) then
			tinsert(combats, _detalhes.tabela_overall)
			overall_added = true
		end

		for index, combat in ipairs(combats) do
			_detalhes.clear:c_combate (combat)
			for index, container in ipairs(combat) do
				_detalhes.clear:c_container_combatentes (container)
			end
		end

		if (overall_added) then
			tremove(combats, #combats)
		end
	end

	function _detalhes:DoContainerIndexCleanup()
		local combats = _detalhes.tabela_historico.tabelas or {}
		local overall_added
		if (not _detalhes.overall_clear_logout) then
			tinsert(combats, _detalhes.tabela_overall)
			overall_added = true
		end

		for index, combat in ipairs(combats) do
			for index, container in ipairs(combat) do
				_detalhes.clear:c_container_combatentes_index (container)
			end
		end

		if (overall_added) then
			tremove(combats, #combats)
		end
	end

	--limpa indexes, metatables e shadows
		function _detalhes:PrepareTablesForSave()

		_detalhes.clear_ungrouped = true

		--clear instances
			_detalhes:DoInstanceCleanup()
			_detalhes:DoClassesCleanup() --aumentou 1 combat
			_detalhes:DoContainerCleanup() --aumentou 1 combat

		--clear combats
			local tabelas_de_combate = {}
			local historico_tabelas = _detalhes.tabela_historico.tabelas or {}

			--remove os segmentos de trash
			for i = #historico_tabelas, 1, -1  do
				local combate = historico_tabelas [i]
				if (combate:IsTrash()) then
					table.remove (historico_tabelas, i)
				end
			end

			--remove os segmentos > que o limite permitido para salvar
			if (_detalhes.segments_amount_to_save and _detalhes.segments_amount_to_save < _detalhes.segments_amount) then
				for i = _detalhes.segments_amount, _detalhes.segments_amount_to_save+1, -1  do
					if (_detalhes.tabela_historico.tabelas [i]) then
						table.remove (_detalhes.tabela_historico.tabelas, i)
					end
				end
			end

			--tabela do combate atual
			local tabela_atual = _detalhes.tabela_vigente or _detalhes.combate:NovaTabela (_, _detalhes.tabela_overall)

			--limpa a tabela overall
			if (_detalhes.overall_clear_logout) then
				_detalhes.tabela_overall = nil
				_detalhes_database.tabela_overall = nil
			else
				local _combate = _detalhes.tabela_overall

				_combate.previous_combat = nil
				local todos_atributos = {_combate [class_type_dano] or {}, _combate [class_type_cura] or {}, _combate [class_type_e_energy] or {}, _combate [class_type_misc] or {}}

				for class_type, _tabela in ipairs(todos_atributos) do
					local conteudo = _tabela._ActorTable

					--Limpa tabelas que n�o estejam em grupo
					if (conteudo) then
						if (_detalhes.clear_ungrouped) then
						--if (not _detalhes.clear_ungrouped) then
							local _iter = {index = 1, data = conteudo[1], cleaned = 0} --._ActorTable[1] para pegar o primeiro index

							while (_iter.data) do --search key: ~deletar ~apagar
								local can_erase = true

								if (_iter.data.grupo or _iter.data.boss or _iter.data.boss_fight_component or _iter.data.pvp_component or _iter.data.fight_component) then
									can_erase = false
								else

									local owner = _iter.data.owner
									if (owner) then
										local owner_actor = _combate [class_type]._NameIndexTable [owner.nome]
										if (owner_actor) then
											local owner_actor = _combate [class_type]._ActorTable [owner_actor]
											if (owner_actor) then
												if (owner.grupo or owner.boss or owner.boss_fight_component or owner.fight_component) then
													can_erase = false
												end
											end
										end
									end
								end

								if (can_erase) then
									_table_remove(conteudo, _iter.index)
									_iter.cleaned = _iter.cleaned + 1
									_iter.data = conteudo [_iter.index]
								else
									_iter.index = _iter.index + 1
									_iter.data = conteudo [_iter.index]
								end
							end

							if (_iter.cleaned > 0) then
								ReconstroiMapa (_tabela)
							end
						end
					end
				end
			end

			for _, _tabela in ipairs(historico_tabelas) do
				tabelas_de_combate [#tabelas_de_combate+1] = _tabela
			end

			for tabela_index, _combate in ipairs(tabelas_de_combate) do

				--limpa a tabela do grafico
				if (_detalhes.clear_graphic) then
					_combate.TimeData = {}
				end

				--limpa a referencia do ultimo combate
				_combate.previous_combat = nil

				local container_dano = _combate [class_type_dano] or {}
				local container_cura = _combate [class_type_cura] or {}
				local container_e_energy = _combate [class_type_e_energy] or {}
				local container_misc = _combate [class_type_misc] or {}

				local todos_atributos = {container_dano, container_cura, container_e_energy, container_misc}

				local IsBossEncounter = _combate.is_boss
				if (IsBossEncounter) then
					if (_combate.pvp) then
						IsBossEncounter = false
					end
				end

				if (not _combate.is_mythic_dungeon_segment) then
					for class_type, _tabela in ipairs(todos_atributos) do

						local conteudo = _tabela._ActorTable

						--Limpa tabelas que n�o estejam em grupo
						if (conteudo) then

							if (_detalhes.clear_ungrouped) then
							--n�o deleta dummies e actors de fora do grupo
							--if (not _detalhes.clear_ungrouped) then

								local _iter = {index = 1, data = conteudo[1], cleaned = 0} --._ActorTable[1] para pegar o primeiro index

								while (_iter.data) do --search key: ~deletar ~apagar
									local can_erase = true

									if (_iter.data.grupo or _iter.data.boss or _iter.data.boss_fight_component or IsBossEncounter or _iter.data.pvp_component or _iter.data.fight_component) then
										can_erase = false
									else
										local owner = _iter.data.owner
										if (owner) then
											local owner_actor = _combate [class_type]._NameIndexTable [owner.nome]
											if (owner_actor) then
												local owner_actor = _combate [class_type]._ActorTable [owner_actor]
												if (owner_actor) then
													if (owner.grupo or owner.boss or owner.boss_fight_component or owner.fight_component) then
														can_erase = false
													end
												end
											end
										end
									end

									if (can_erase) then

										if (not _iter.data.owner) then --pet
											local myself = _iter.data

											if (myself.tipo == class_type_dano or myself.tipo == class_type_cura and _combate.totals [myself.tipo] and myself.total) then
												_combate.totals [myself.tipo] = _combate.totals [myself.tipo] - (myself.total or 0)
												if (myself.grupo) then
													_combate.totals_grupo [myself.tipo] = _combate.totals_grupo [myself.tipo] - (myself.total or 0)
												end

											elseif (myself.tipo == class_type_e_energy and _combate.totals [myself.tipo] and _combate.totals [myself.tipo] [myself.powertype] and myself.total) then
												_combate.totals [myself.tipo] [myself.powertype] = _combate.totals [myself.tipo] [myself.powertype] - (myself.total or 0)
												if (myself.grupo) then
													_combate.totals_grupo [myself.tipo] [myself.powertype] = _combate.totals_grupo [myself.tipo] [myself.powertype] - (myself.total or 0)
												end

											elseif (myself.tipo == class_type_misc) then
												if (myself.cc_break and _combate.totals[myself.tipo] and _combate.totals [myself.tipo] and _combate.totals [myself.tipo] ["cc_break"]) then
													_combate.totals [myself.tipo] ["cc_break"] = _combate.totals [myself.tipo] ["cc_break"] - (myself.cc_break or 0)
													if (myself.grupo) then
														_combate.totals_grupo [myself.tipo] ["cc_break"] = _combate.totals_grupo [myself.tipo] ["cc_break"] - (myself.cc_break or 0)
													end
												end
												if (myself.ress and _combate.totals [myself.tipo] and _combate.totals [myself.tipo] ["ress"]) then
													_combate.totals [myself.tipo] ["ress"] = _combate.totals [myself.tipo] ["ress"] - (myself.ress or 0)
													if (myself.grupo) then
														_combate.totals_grupo [myself.tipo] ["ress"] = _combate.totals_grupo [myself.tipo] ["ress"] - (myself.ress or 0)
													end
												end
												--n�o precisa diminuir o total dos buffs e debuffs
												if (myself.cooldowns_defensive and _combate.totals [myself.tipo] and _combate.totals [myself.tipo] ["cooldowns_defensive"]) then
													_combate.totals [myself.tipo] ["cooldowns_defensive"] = _combate.totals [myself.tipo] ["cooldowns_defensive"] - (myself.cooldowns_defensive or 0)
													if (myself.grupo) then
														_combate.totals_grupo [myself.tipo] ["cooldowns_defensive"] = _combate.totals_grupo [myself.tipo] ["cooldowns_defensive"] - (myself.cooldowns_defensive or 0)
													end
												end
												if (myself.interrupt and _combate.totals [myself.tipo] and _combate.totals [myself.tipo] ["interrupt"]) then
													_combate.totals [myself.tipo] ["interrupt"] = _combate.totals [myself.tipo] ["interrupt"] - (myself.interrupt or 0)
													if (myself.grupo) then
														_combate.totals_grupo [myself.tipo] ["interrupt"] = _combate.totals_grupo [myself.tipo] ["interrupt"] - (myself.interrupt or 0)
													end
												end
												if (myself.dispell and _combate.totals [myself.tipo] and _combate.totals [myself.tipo] ["dispell"]) then
													_combate.totals [myself.tipo] ["dispell"] = _combate.totals [myself.tipo] ["dispell"] - (myself.dispell or 0)
													if (myself.grupo) then
														_combate.totals_grupo [myself.tipo] ["dispell"] = _combate.totals_grupo [myself.tipo] ["dispell"] - (myself.dispell or 0)
													end
												end
												if (myself.dead and _combate.totals [myself.tipo] and _combate.totals [myself.tipo] ["dead"]) then
													_combate.totals [myself.tipo] ["dead"] = _combate.totals [myself.tipo] ["dead"] - (myself.dead or 0)
													if (myself.grupo) then
														_combate.totals_grupo [myself.tipo] ["dead"] = _combate.totals_grupo [myself.tipo] ["dead"] - (myself.dead or 0)
													end
												end
											end
										end

										_table_remove(conteudo, _iter.index)
										_iter.cleaned = _iter.cleaned + 1
										_iter.data = conteudo [_iter.index]
									else
										_iter.index = _iter.index + 1
										_iter.data = conteudo [_iter.index]
									end
								end

								if (_iter.cleaned > 0) then
									ReconstroiMapa (_tabela)
								end

							end
						end

					end

				end --end is mythic dungeon segment
			end

			--panic mode
				if (_detalhes.segments_panic_mode and _detalhes.can_panic_mode) then
					if (_detalhes.tabela_vigente.is_boss) then
						_detalhes.tabela_historico = _detalhes.historico:NovoHistorico()
					end
				end

			--clear all segments on logoff
				if (_detalhes.data_cleanup_logout) then
					_detalhes.tabela_historico = _detalhes.historico:NovoHistorico()
					_detalhes.tabela_overall = nil
					_detalhes_database.tabela_overall = nil
				end

			--clear customs
				_detalhes.clear:c_atributo_custom()

			--clear owners
				_detalhes:DoOwnerCleanup()

			--cleaer container indexes
				_detalhes:DoContainerIndexCleanup()
		end

	function _detalhes:reset_window (instancia)
		if (instancia.segmento == -1) then
			instancia.showing[instancia.atributo].need_refresh = true
			instancia.v_barras = true
			instancia:ResetaGump()
			instancia:RefreshMainWindow(true)
		end
	end

	--desativado 7.2.5 veio com algum bug e a checagem de memoria esta sendo feita durante o combate
	function _detalhes:CheckMemoryAfterCombat()
		if (_detalhes.next_memory_check < time() and not InCombatLockdown() and not UnitAffectingCombat("player")) then
			_detalhes.next_memory_check = time()+_detalhes.intervalo_memoria
			UpdateAddOnMemoryUsage()
			local memory = GetAddOnMemoryUsage ("Details")
			if (memory > _detalhes.memory_ram) then
				_detalhes:IniciarColetaDeLixo (true, 60) --sending true doesn't check anythink
			end
		end
	end

	function _detalhes:CheckMemoryPeriodically()
		if (_detalhes.next_memory_check <= time() and not _InCombatLockdown() and not _detalhes.in_combat and not UnitAffectingCombat("player")) then
			_detalhes.next_memory_check = time() + _detalhes.intervalo_memoria - 3
			UpdateAddOnMemoryUsage()
			local memory = GetAddOnMemoryUsage ("Details")
			if (_detalhes.debug) then
				_detalhes:Msg("(debug) checking memory periodically. Using: ",math.floor(memory))
			end
			if (memory > _detalhes.memory_ram * 1000) then
				_detalhes:IniciarColetaDeLixo (1, 60) --sending 1 only check for combat and ignore garbage collect cooldown
			end
		end
	end

	function _detalhes:IniciarColetaDeLixo (forcar, lastevent)

		if (not forcar) then
			if (_detalhes.ultima_coleta + _detalhes.intervalo_coleta > _detalhes._tempo + 1)  then
				return
			elseif (_detalhes.in_combat or _InCombatLockdown() or _detalhes:IsInInstance()) then
				_detalhes:ScheduleTimer("IniciarColetaDeLixo", 5)
				return
			end
		else
			if (type(forcar) ~= "boolean") then
				if (forcar == 1) then
					if (_detalhes.in_combat or _InCombatLockdown()) then
						_detalhes:ScheduleTimer("IniciarColetaDeLixo", 5, forcar)
						return
					end
				end
			end
		end

		if (_detalhes.debug) then
			if (forcar) then
				_detalhes:Msg("(debug) collecting garbage with forced state: ", forcar)
			else
				_detalhes:Msg("(debug) collecting garbage.")
			end
		end

		local memory = GetAddOnMemoryUsage ("Details")

		--reseta o cache do parser
		_detalhes:ClearParserCache()

		--limpa barras que n�o est�o sendo usadas nas inst�ncias.
		for index, instancia in ipairs(_detalhes.tabela_instancias) do
			if (instancia.barras and instancia.barras [1]) then
				for i, barra in ipairs(instancia.barras) do
					if (not barra:IsShown()) then
						barra.minha_tabela = nil
					end
				end
			end
		end

		--faz a coleta nos 4 atributos
		local damage = atributo_damage:ColetarLixo (lastevent)
		local heal = atributo_heal:ColetarLixo (lastevent)
		local energy = atributo_energy:ColetarLixo (lastevent)
		local misc = atributo_misc:ColetarLixo (lastevent)

		local limpados = damage + heal + energy + misc

		--refresh nas janelas
		if (limpados > 0) then
			_detalhes:InstanciaCallFunction(_detalhes.reset_window)
		end

		_detalhes:ManutencaoTimeMachine()

		--print cache states
		--if (_detalhes.debug) then
		--	_detalhes:Msg("(debug) removed: damage "..damage.." heal "..heal.." energy "..energy.." misc "..misc)
		--end

		--elimina pets antigos
		_detalhes:LimparPets()
		if (not _detalhes.in_combat) then
			_detalhes:ClearCCPetsBlackList()
		end

		--reseta cache de specs
		_detalhes:ResetSpecCache()

		--wipa container de escudos
		wipe(_detalhes.escudos)

		_detalhes.ultima_coleta = _detalhes._tempo

		if (_detalhes.debug) then
			collectgarbage()
			UpdateAddOnMemoryUsage()
			--local memory2 = GetAddOnMemoryUsage ("Details")
			--_detalhes:Msg("(debug) memory before: "..memory.." memory after: "..memory2)
		end

	end

	--combates Normais
	local function FazColeta (_combate, tipo, intervalo_overwrite)

		local conteudo = _combate [tipo]._ActorTable
		local _iter = {index = 1, data = conteudo[1], cleaned = 0}
		local _tempo  = _time()

		--local links_removed = 0

		--do not collect things in a mythic+ dungeon segment
		if (_combate.is_mythic_dungeon_trash or _combate.is_mythic_dungeon_run_id or _combate.is_mythic_dungeon_segment) then
			return 0
		end

		while (_iter.data) do

			local _actor = _iter.data
			local can_garbage = false

			local t
			if (intervalo_overwrite) then
				t =  _actor.last_event + intervalo_overwrite
			else
				t = _actor.last_event + _detalhes.intervalo_coleta
			end

			if (t < _tempo and not _actor.grupo and not _actor.boss and not _actor.fight_component and not _actor.boss_fight_component) then
				local owner = _actor.owner
				if (owner) then
					local owner_actor = _combate (tipo, owner.nome)
					if (not owner.grupo and not owner.boss and not owner.boss_fight_component) then
						can_garbage = true
					end
				else
					can_garbage = true
				end
			end

			if (can_garbage) then
				if (not _actor.owner) then --pet
					_actor:subtract_total (_combate)
				end

				_iter.cleaned = _iter.cleaned+1

				if (_actor.tipo == 1 or _actor.tipo == 2) then
					_actor:DesregistrarNaTimeMachine()
				end

				_table_remove(conteudo, _iter.index)
				_iter.data = conteudo [_iter.index]
			else
				_iter.index = _iter.index + 1
				_iter.data = conteudo [_iter.index]
			end

		end

		--if (_detalhes.debug) then
			-- _detalhes:Msg("- garbage collect:", tipo, "actors removed:",_iter.cleaned)
		--end

		if (_iter.cleaned > 0) then
			ReconstroiMapa (_combate [tipo])
			_combate [tipo].need_refresh = true
		end

		return _iter.cleaned
	end

	--Combate overall
	function _detalhes:ColetarLixo (tipo, lastevent)

		--print("fazendo coleta...")

		local _tempo  = _time()
		local limpados = 0

		--monta a lista de combates
		local tabelas_de_combate = {}
		for _, _tabela in ipairs(_detalhes.tabela_historico.tabelas) do
			if (_tabela ~= _detalhes.tabela_vigente) then
				tabelas_de_combate [#tabelas_de_combate+1] = _tabela
			end
		end
		tabelas_de_combate [#tabelas_de_combate+1] = _detalhes.tabela_vigente

		--faz a coleta em todos os combates para este atributo
		for _, _combate in ipairs(tabelas_de_combate) do
			limpados = limpados + FazColeta (_combate, tipo, lastevent)
		end

		--limpa a tabela overall para o atributo atual (limpa para os 4, um de cada vez atrav�s do ipairs)
		local _overall_combat = _detalhes.tabela_overall
		local conteudo = _overall_combat [tipo]._ActorTable
		local _iter = {index = 1, data = conteudo[1], cleaned = 0} --._ActorTable[1] para pegar o primeiro index

		while (_iter.data) do

			local _actor = _iter.data

			local can_garbage = false
			if (not _actor.grupo and not _actor.owner and not _actor.boss_fight_component and not _actor.fight_component) then
				can_garbage = true
			end

			if (can_garbage) then --n�o h� refer�ncias a este objeto

				if (not _actor.owner) then --pet
					_actor:subtract_total (_overall_combat)
				end

				--apaga a refer�ncia deste jogador na tabela overall
				_iter.cleaned = _iter.cleaned+1

				_table_remove(conteudo, _iter.index)

				_iter.data = conteudo [_iter.index]
			else
				_iter.index = _iter.index + 1
				_iter.data = conteudo [_iter.index]
			end

		end

		--termina o coletor de lixo
		if (_iter.cleaned > 0) then
			_overall_combat[tipo].need_refresh = true
			ReconstroiMapa (_overall_combat [tipo])
			limpados = limpados + _iter.cleaned
		end

		if (limpados > 0) then
			_detalhes:InstanciaCallFunction(_detalhes.ScheduleUpdate)
			_detalhes:RefreshMainWindow(-1)
		end

		return limpados
	end
