return {
	{
		"mfussenegger/nvim-dap",
	},
	{
		"rcarriga/nvim-dap-ui",
		dependencies = "nvim-neotest/nvim-nio",
	},
	{
		"theHamsta/nvim-dap-virtual-text",
		dependencies = "mfussenegger/nvim-dap",
	},
	{
		"mfussenegger/nvim-dap-python",
		dependencies = "mfussenegger/nvim-dap",
		config = function()
			local dap = require("dap")
			local dapui = require("dapui")
			require("dap-python").setup()

			dapui.setup({
				icons = { expanded = "▾", collapsed = "▸", current_frame = "▸" },
				mappings = {
					expand = { "<CR>", "<2-LeftMouse>" },
					open = "o",
					remove = "d",
					edit = "e",
					repl = "r",
					toggle = "t",
				},
				expand_lines = vim.fn.has("nvim-0.7") == 1,
				layouts = {
					{
						elements = {
							{ id = "scopes", size = 0.25 },
							{ id = "breakpoints", size = 0.25 },
							{ id = "stacks", size = 0.25 },
							{ id = "watches", size = 0.25 },
						},
						size = 0.25,
						position = "right",
					},
					{
						elements = {
							{ id = "repl", size = 0.5 },
							{ id = "console", size = 0.5 },
						},
						position = "bottom",
						size = 0.25,
					},
				},
				floating = {
					max_height = nil,
					max_width = nil,
					border = "rounded",
					mappings = {
						close = { "q", "<Esc>" },
					},
				},
				windows = { indent = 1 },
			})

			dap.listeners.after.event_initialized["dapui_config"] = function()
				dapui.open()
			end
			dap.listeners.before.event_terminated["dapui_config"] = function()
				dapui.close()
			end
			dap.listeners.before.event_exited["dapui_config"] = function()
				dapui.close()
			end

			dap.configurations.python = {
				{
					type = "python",
					request = "launch",
					name = "Launch file",
					program = "${file}",
					pythonPath = function()
						return vim.fn.exepath("python3") or "python"
					end,
				},
				{
					type = "python",
					request = "launch",
					name = "Debug current file (integrated terminal)",
					program = "${file}",
					console = "integratedTerminal",
					pythonPath = function()
						return vim.fn.exepath("python3") or "python"
					end,
				},
				{
					type = "python",
					request = "launch",
					name = "Debug with arguments",
					program = "${file}",
					args = function()
						local args = vim.fn.input("Args: ", ""):split(" ")
						return args
					end,
					console = "integratedTerminal",
					pythonPath = function()
						return vim.fn.exepath("python3") or "python"
					end,
				},
				{
					type = "python",
					request = "launch",
					name = "Debug test_api.py",
					module = "unittest",
					args = { "test.test_api", "-v" },
					cwd = "${workspaceFolder}",
					pythonPath = function()
						return vim.fn.exepath("python3") or "python"
					end,
				},
				{
					type = "python",
					request = "launch",
					name = "Debug all tests",
					module = "unittest",
					args = { "discover", "-s", "test", "-v" },
					cwd = "${workspaceFolder}",
					pythonPath = function()
						return vim.fn.exepath("python3") or "python"
					end,
				},
			}

			vim.keymap.set("n", "<leader>db", dap.toggle_breakpoint, { desc = "Toggle breakpoint" })
			vim.keymap.set("n", "<leader>dc", dap.continue, { desc = "Continue" })
			vim.keymap.set("n", "<leader>ds", dap.step_over, { desc = "Step over" })
			vim.keymap.set("n", "<leader>di", dap.step_into, { desc = "Step into" })
			vim.keymap.set("n", "<leader>do", dap.step_out, { desc = "Step out" })
			vim.keymap.set("n", "<leader>dr", dap.repl.open, { desc = "Open REPL" })
			vim.keymap.set("n", "<leader>dl", dap.run_last, { desc = "Run last debug config" })
			vim.keymap.set("n", "<leader>du", dapui.toggle, { desc = "Toggle DAP UI" })
		end,
	},
}
