{
  "format": "wa1-module",
  "formatVersion": 1,
  "name": "目标距离 HUD 示例",
  "author": null,
  "class": "All",
  "globalName": "SuperDPS",
  "spellQueueWindow": 250,
  "initCode": "-- 目标距离档（手动配置）：各「射程N」属性的参数填检测技能 ID——第 1 个对敌方目标用、第 2 个对友方目标用，\n-- 不填就不检测该类目标。这里只提供公共函数：按技能 ID 查最小 / 最大射程（近战 0 码按 5，上限 99），\n-- 首次见到某个 ID 时在聊天框打印一行，并每拍按属性顺序登记各档码数供「射程表」「射程下限表」打包。\n-- 「射程表」「射程下限表」两个属性要放在射程1..4 之前（它们读上一拍的登记）。\n-- 12.0 秘密值规则下只有 C_Spell.IsSpellInRange 这类射程布尔可用，且不能在游戏端合并或判断，\n-- 所以每档一个属性、原样回传，区间判断放在桌面 HUD 脚本里。\n-- 注意：「下一次近战攻击」类技能（猛禽一击、英勇打击、顺劈斩、重殴）施放不检查距离，IsSpellInRange 恒真，不能用来测距。\nlocal info, announced = {}, {} -- id → { min, max, name }；已打印过的键\nSuperDPS.Prop.Range = { cur = {}, last = {} }\nlocal R = SuperDPS.Prop.Range\n\nlocal function say(key, msg)\n    if announced[key] then return end\n    announced[key] = true\n    SuperDPS.Print(msg)\nend\n\nR.lookup = function(id)\n    if not id then return nil end\n    if info[id] then return info[id] end\n    local s = C_Spell and C_Spell.GetSpellInfo and C_Spell.GetSpellInfo(id)\n    if not s then\n        say(\"bad\" .. id, \"目标距离：技能 ID \" .. tostring(id) .. \" 无效，本档按不检测处理\")\n        return nil\n    end\n    local maxR = s.maxRange or 0\n    if maxR == 0 then maxR = 5 end -- 近战技能：射程 0 = 近战 5 码\n    local e = { min = s.minRange or 0, max = math.min(maxR, 99), name = s.name or tostring(id) }\n    info[id] = e\n    say(\"id\" .. id, \"目标距离档：\" .. (e.min > 0 and (e.min .. \"–\") or \"\") .. e.max .. \"码 \" .. e.name .. \"（ID \" .. id .. \"）\")\n    return e\nend\n\n-- 「射程N」每拍调用一次：两个 ID 都查一遍（首次打印），并按属性顺序登记本拍对当前目标实际使用的那一档\nR.register = function(harmId, friendId, id)\n    R.lookup(harmId)\n    R.lookup(friendId)\n    R.cur[#R.cur + 1] = R.lookup(id) or { min = 0, max = 0 }\nend\n\n-- 「射程表」每拍先调用：上一拍的登记完整后封存，供两张表打包\nR.seal = function()\n    if #R.cur > 0 then\n        R.last = R.cur\n        R.cur = {}\n    end\nend\n\n-- field = \"max\" / \"min\"：档1 + 档2×100 + 档3×10000 + 档4×1000000（最多 4 档，空档 0）\nR.pack = function(field)\n    local packed = 0\n    for k, e in ipairs(R.last) do\n        if k <= 4 then packed = packed + e[field] * 100 ^ (k - 1) end\n    end\n    return packed\nend\n\n-- IsSpellInRange 返回 nil：技能未学会或不能对当前目标施放，打印一次\nR.invalid = function(id)\n    local e = info[id]\n    say(\"nil\" .. id, \"目标距离：\" .. (e and e.name or tostring(id)) .. \" 对当前目标返回无效（未学会或不能对该目标施放），本档按不检测处理\")\nend\n\nSuperDPS.Print(\"目标距离：手动配置模式，「射程N」属性参数填「敌方技能ID, 友方技能ID」，不填不检测\")",
  "hud": "-- 目标距离 HUD：「射程表」「射程下限表」给出当前目标适用各档的最大 / 最小码数（各「射程N」属性参数里\n-- 手动填的检测技能，最多 4 档），「射程1..4」各回传目标是否在该档技能射程内（3 = 无目标，2 = 空档，1 / 0 = 是 / 否）。\n-- 把 0 与各档上下限切成小区间，逐段检验与全部档位结果是否一致，得到目标可能所在的距离区间。\n-- 有最小射程的技能（自动射击 8–35 码）「不在射程内」既可能太近也可能太远：有近战档能排除一边就取剩下的那段，\n-- 排除不了就把「< 8 或 > 35 码」都显示出来——想分清就再填一档近战技能（如自动攻击 6603）。\n-- 秘密值只能显示不能运算，判断全放桌面侧\nHud.Init(function()\n    -- 只有一行数字：无背景、无进度条，整体透明度 0.8\n    Hud.Frame(\"rangePanel\", { anchor = \"CENTER\", y = 220, w = 260, h = 48, alpha = 0.8, hidden = true, enter = \"pop\", exit = \"fade\" })\n    Hud.Text(\"rangeValue\", { parent = \"rangePanel\", anchor = \"CENTER\", size = 34, bold = true, color = \"#ffffff\", text = \"--\" })\nend)\nlocal packed, packedMin = Prop(\"射程表\"), Prop(\"射程下限表\")\nHud.Show(\"rangePanel\", packed >= 0)\nif packed < 0 then return end\nlocal FAR = 999\nlocal rungs, known = {}, false\nfor k = 1, 4 do\n    local yards = math.floor(packed / 100 ^ (k - 1)) % 100\n    if yards > 0 then\n        local v = Prop(\"射程\" .. k)\n        if v == 1 or v == 0 then\n            known = true\n            rungs[#rungs + 1] = { min = math.floor(packedMin / 100 ^ (k - 1)) % 100, max = yards, inside = v == 1 }\n        end\n    end\nend\nlocal pts, seen = { 0, FAR }, { [0] = true, [FAR] = true }\nfor _, r in ipairs(rungs) do\n    for _, p in ipairs({ r.min, r.max }) do\n        if not seen[p] then seen[p] = true pts[#pts + 1] = p end\n    end\nend\ntable.sort(pts)\nlocal segs = {}\nfor i = 1, #pts - 1 do\n    local a, b = pts[i], pts[i + 1]\n    local mid, ok = (a + b) / 2, true\n    for _, r in ipairs(rungs) do\n        if (mid >= r.min and mid <= r.max) ~= r.inside then ok = false break end\n    end\n    if ok then\n        local last = segs[#segs]\n        if last and last[2] == a then last[2] = b else segs[#segs + 1] = { a, b } end\n    end\nend\n-- 不连通时：宽度 ≤ 3 码的小缝（近战 5 码与 8 码下限之间）当噪声丢掉；仍有多段就把几种可能都显示出来\nlocal wide, best = {}, nil\nfor _, seg in ipairs(segs) do\n    if seg[2] - seg[1] > 3 then wide[#wide + 1] = seg end\n    if not best or (seg[2] - seg[1]) > (best[2] - best[1]) then best = seg end\nend\n-- 配色：在远程技能射程内绿色；超出最远档红色呼吸；比远程技能的最小射程还近（太近）白色呼吸；分不清橙色呼吸\nlocal nearLimit = 0 -- 各档最小射程里最小的非零值 = 「太近」的分界\nfor _, r in ipairs(rungs) do\n    if r.min > 0 and (nearLimit == 0 or r.min < nearLimit) then nearLimit = r.min end\nend\nlocal text, color, alert = \"--\", \"#888888\", false\nif not known then\n    text = \"无射程技能\"\nelseif #wide > 1 then\n    local parts = {}\n    for _, seg in ipairs(wide) do\n        parts[#parts + 1] = seg[2] >= FAR and (\"> \" .. seg[1]) or seg[1] > 0 and (seg[1] .. \" – \" .. seg[2]) or (\"< \" .. seg[2])\n    end\n    text, color, alert = table.concat(parts, \" 或 \") .. \" 码\", \"#f39c12\", true\nelseif best then\n    local lo, hi = best[1], best[2]\n    if hi >= FAR then\n        text, color, alert = \"> \" .. lo .. \" 码\", \"#e74c3c\", true\n    else\n        text = lo > 0 and (lo .. \" – \" .. hi .. \" 码\") or (\"≤ \" .. hi .. \" 码\")\n        if nearLimit > 0 and hi <= nearLimit then\n            color, alert = \"#ffffff\", true\n        else\n            color = \"#2ecc71\"\n        end\n    end\nend\nHud.Set(\"rangeValue\", { text = text, color = color })\nHud.Loop(\"rangePanel\", alert and \"breathe\" or false)",
  "macros": [
    {
      "index": 1,
      "hotkey": "ALT-SHIFT-NUMPAD1",
      "name": "",
      "macro": ""
    },
    {
      "index": 2,
      "hotkey": "ALT-SHIFT-NUMPAD2",
      "name": "",
      "macro": ""
    },
    {
      "index": 3,
      "hotkey": "ALT-SHIFT-NUMPAD3",
      "name": "",
      "macro": ""
    },
    {
      "index": 4,
      "hotkey": "ALT-SHIFT-NUMPAD4",
      "name": "",
      "macro": ""
    },
    {
      "index": 5,
      "hotkey": "ALT-SHIFT-NUMPAD5",
      "name": "",
      "macro": ""
    },
    {
      "index": 6,
      "hotkey": "ALT-SHIFT-NUMPAD6",
      "name": "",
      "macro": ""
    },
    {
      "index": 7,
      "hotkey": "ALT-SHIFT-NUMPAD7",
      "name": "",
      "macro": ""
    },
    {
      "index": 8,
      "hotkey": "ALT-SHIFT-NUMPAD8",
      "name": "",
      "macro": ""
    },
    {
      "index": 9,
      "hotkey": "ALT-SHIFT-NUMPAD9",
      "name": "",
      "macro": ""
    },
    {
      "index": 10,
      "hotkey": "ALT-SHIFT-NUMPAD0",
      "name": "",
      "macro": ""
    },
    {
      "index": 11,
      "hotkey": "CTRL-SHIFT-NUMPAD1",
      "name": "",
      "macro": ""
    },
    {
      "index": 12,
      "hotkey": "CTRL-SHIFT-NUMPAD2",
      "name": "",
      "macro": ""
    },
    {
      "index": 13,
      "hotkey": "CTRL-SHIFT-NUMPAD3",
      "name": "",
      "macro": ""
    },
    {
      "index": 14,
      "hotkey": "CTRL-SHIFT-NUMPAD4",
      "name": "",
      "macro": ""
    },
    {
      "index": 15,
      "hotkey": "CTRL-SHIFT-NUMPAD5",
      "name": "",
      "macro": ""
    },
    {
      "index": 16,
      "hotkey": "CTRL-SHIFT-NUMPAD6",
      "name": "",
      "macro": ""
    },
    {
      "index": 17,
      "hotkey": "CTRL-SHIFT-NUMPAD7",
      "name": "",
      "macro": ""
    },
    {
      "index": 18,
      "hotkey": "CTRL-SHIFT-NUMPAD8",
      "name": "",
      "macro": ""
    },
    {
      "index": 19,
      "hotkey": "CTRL-SHIFT-NUMPAD9",
      "name": "",
      "macro": ""
    },
    {
      "index": 20,
      "hotkey": "CTRL-SHIFT-NUMPAD0",
      "name": "",
      "macro": ""
    },
    {
      "index": 21,
      "hotkey": "SHIFT-NUMPAD1",
      "name": "",
      "macro": ""
    },
    {
      "index": 22,
      "hotkey": "SHIFT-NUMPAD2",
      "name": "",
      "macro": ""
    },
    {
      "index": 23,
      "hotkey": "SHIFT-NUMPAD3",
      "name": "",
      "macro": ""
    },
    {
      "index": 24,
      "hotkey": "SHIFT-NUMPAD4",
      "name": "",
      "macro": ""
    },
    {
      "index": 25,
      "hotkey": "SHIFT-NUMPAD5",
      "name": "",
      "macro": ""
    },
    {
      "index": 26,
      "hotkey": "SHIFT-NUMPAD6",
      "name": "",
      "macro": ""
    },
    {
      "index": 27,
      "hotkey": "SHIFT-NUMPAD7",
      "name": "",
      "macro": ""
    },
    {
      "index": 28,
      "hotkey": "SHIFT-NUMPAD8",
      "name": "",
      "macro": ""
    },
    {
      "index": 29,
      "hotkey": "SHIFT-NUMPAD9",
      "name": "",
      "macro": ""
    },
    {
      "index": 30,
      "hotkey": "SHIFT-NUMPAD0",
      "name": "",
      "macro": ""
    },
    {
      "index": 31,
      "hotkey": "CTRL-NUMPAD1",
      "name": "",
      "macro": ""
    },
    {
      "index": 32,
      "hotkey": "CTRL-NUMPAD2",
      "name": "",
      "macro": ""
    },
    {
      "index": 33,
      "hotkey": "CTRL-NUMPAD3",
      "name": "",
      "macro": ""
    },
    {
      "index": 34,
      "hotkey": "CTRL-NUMPAD4",
      "name": "",
      "macro": ""
    },
    {
      "index": 35,
      "hotkey": "CTRL-NUMPAD5",
      "name": "",
      "macro": ""
    },
    {
      "index": 36,
      "hotkey": "CTRL-NUMPAD6",
      "name": "",
      "macro": ""
    },
    {
      "index": 37,
      "hotkey": "CTRL-NUMPAD7",
      "name": "",
      "macro": ""
    },
    {
      "index": 38,
      "hotkey": "CTRL-NUMPAD8",
      "name": "",
      "macro": ""
    },
    {
      "index": 39,
      "hotkey": "CTRL-NUMPAD9",
      "name": "",
      "macro": ""
    },
    {
      "index": 40,
      "hotkey": "CTRL-NUMPAD0",
      "name": "",
      "macro": ""
    },
    {
      "index": 41,
      "hotkey": "ALT-NUMPAD1",
      "name": "",
      "macro": ""
    },
    {
      "index": 42,
      "hotkey": "ALT-NUMPAD2",
      "name": "",
      "macro": ""
    },
    {
      "index": 43,
      "hotkey": "ALT-NUMPAD3",
      "name": "",
      "macro": ""
    },
    {
      "index": 44,
      "hotkey": "ALT-NUMPAD4",
      "name": "",
      "macro": ""
    },
    {
      "index": 45,
      "hotkey": "ALT-NUMPAD5",
      "name": "",
      "macro": ""
    },
    {
      "index": 46,
      "hotkey": "ALT-NUMPAD6",
      "name": "",
      "macro": ""
    },
    {
      "index": 47,
      "hotkey": "ALT-NUMPAD7",
      "name": "",
      "macro": ""
    },
    {
      "index": 48,
      "hotkey": "ALT-NUMPAD8",
      "name": "",
      "macro": ""
    },
    {
      "index": 49,
      "hotkey": "ALT-NUMPAD9",
      "name": "",
      "macro": ""
    },
    {
      "index": 50,
      "hotkey": "ALT-NUMPAD0",
      "name": "",
      "macro": ""
    },
    {
      "index": 51,
      "hotkey": "ALT-SHIFT-,",
      "name": "",
      "macro": ""
    },
    {
      "index": 52,
      "hotkey": "ALT-SHIFT-.",
      "name": "",
      "macro": ""
    },
    {
      "index": 53,
      "hotkey": "ALT-SHIFT-/",
      "name": "",
      "macro": ""
    },
    {
      "index": 54,
      "hotkey": "ALT-SHIFT-;",
      "name": "",
      "macro": ""
    },
    {
      "index": 55,
      "hotkey": "ALT-SHIFT-'",
      "name": "",
      "macro": ""
    },
    {
      "index": 56,
      "hotkey": "ALT-SHIFT-[",
      "name": "",
      "macro": ""
    },
    {
      "index": 57,
      "hotkey": "ALT-SHIFT-]",
      "name": "",
      "macro": ""
    },
    {
      "index": 58,
      "hotkey": "ALT-SHIFT-=",
      "name": "",
      "macro": ""
    },
    {
      "index": 59,
      "hotkey": "CTRL-SHIFT-,",
      "name": "",
      "macro": ""
    },
    {
      "index": 60,
      "hotkey": "CTRL-SHIFT-.",
      "name": "",
      "macro": ""
    },
    {
      "index": 61,
      "hotkey": "CTRL-SHIFT-/",
      "name": "",
      "macro": ""
    },
    {
      "index": 62,
      "hotkey": "CTRL-SHIFT-;",
      "name": "",
      "macro": ""
    },
    {
      "index": 63,
      "hotkey": "CTRL-SHIFT-'",
      "name": "",
      "macro": ""
    },
    {
      "index": 64,
      "hotkey": "CTRL-SHIFT-[",
      "name": "",
      "macro": ""
    },
    {
      "index": 65,
      "hotkey": "CTRL-SHIFT-]",
      "name": "",
      "macro": ""
    },
    {
      "index": 66,
      "hotkey": "CTRL-SHIFT-=",
      "name": "",
      "macro": ""
    },
    {
      "index": 67,
      "hotkey": "SHIFT-,",
      "name": "",
      "macro": ""
    },
    {
      "index": 68,
      "hotkey": "SHIFT-.",
      "name": "",
      "macro": ""
    },
    {
      "index": 69,
      "hotkey": "SHIFT-/",
      "name": "",
      "macro": ""
    },
    {
      "index": 70,
      "hotkey": "SHIFT-;",
      "name": "",
      "macro": ""
    },
    {
      "index": 71,
      "hotkey": "SHIFT-'",
      "name": "",
      "macro": ""
    },
    {
      "index": 72,
      "hotkey": "SHIFT-[",
      "name": "",
      "macro": ""
    },
    {
      "index": 73,
      "hotkey": "SHIFT-]",
      "name": "",
      "macro": ""
    },
    {
      "index": 74,
      "hotkey": "SHIFT-=",
      "name": "",
      "macro": ""
    },
    {
      "index": 75,
      "hotkey": "CTRL-,",
      "name": "",
      "macro": ""
    },
    {
      "index": 76,
      "hotkey": "CTRL-.",
      "name": "",
      "macro": ""
    },
    {
      "index": 77,
      "hotkey": "CTRL-/",
      "name": "",
      "macro": ""
    },
    {
      "index": 78,
      "hotkey": "CTRL-;",
      "name": "",
      "macro": ""
    },
    {
      "index": 79,
      "hotkey": "CTRL-'",
      "name": "",
      "macro": ""
    },
    {
      "index": 80,
      "hotkey": "CTRL-[",
      "name": "",
      "macro": ""
    },
    {
      "index": 81,
      "hotkey": "CTRL-]",
      "name": "",
      "macro": ""
    },
    {
      "index": 82,
      "hotkey": "CTRL-=",
      "name": "",
      "macro": ""
    },
    {
      "index": 83,
      "hotkey": "ALT-,",
      "name": "",
      "macro": ""
    },
    {
      "index": 84,
      "hotkey": "ALT-.",
      "name": "",
      "macro": ""
    },
    {
      "index": 85,
      "hotkey": "ALT-/",
      "name": "",
      "macro": ""
    },
    {
      "index": 86,
      "hotkey": "ALT-;",
      "name": "",
      "macro": ""
    },
    {
      "index": 87,
      "hotkey": "ALT-'",
      "name": "",
      "macro": ""
    },
    {
      "index": 88,
      "hotkey": "ALT-[",
      "name": "",
      "macro": ""
    },
    {
      "index": 89,
      "hotkey": "ALT-]",
      "name": "",
      "macro": ""
    },
    {
      "index": 90,
      "hotkey": "ALT-=",
      "name": "",
      "macro": ""
    },
    {
      "index": 91,
      "hotkey": "ALT-SHIFT-F1",
      "name": "",
      "macro": ""
    },
    {
      "index": 92,
      "hotkey": "ALT-SHIFT-F2",
      "name": "",
      "macro": ""
    },
    {
      "index": 93,
      "hotkey": "ALT-SHIFT-F3",
      "name": "",
      "macro": ""
    },
    {
      "index": 94,
      "hotkey": "ALT-SHIFT-F4",
      "name": "",
      "macro": ""
    },
    {
      "index": 95,
      "hotkey": "ALT-SHIFT-F5",
      "name": "",
      "macro": ""
    },
    {
      "index": 96,
      "hotkey": "ALT-SHIFT-F6",
      "name": "",
      "macro": ""
    },
    {
      "index": 97,
      "hotkey": "ALT-SHIFT-F7",
      "name": "",
      "macro": ""
    },
    {
      "index": 98,
      "hotkey": "ALT-SHIFT-F8",
      "name": "",
      "macro": ""
    },
    {
      "index": 99,
      "hotkey": "ALT-SHIFT-F9",
      "name": "",
      "macro": ""
    },
    {
      "index": 100,
      "hotkey": "ALT-SHIFT-F10",
      "name": "",
      "macro": ""
    },
    {
      "index": 101,
      "hotkey": "ALT-SHIFT-F11",
      "name": "",
      "macro": ""
    },
    {
      "index": 102,
      "hotkey": "ALT-SHIFT-F12",
      "name": "",
      "macro": ""
    },
    {
      "index": 103,
      "hotkey": "CTRL-SHIFT-F1",
      "name": "",
      "macro": ""
    },
    {
      "index": 104,
      "hotkey": "CTRL-SHIFT-F2",
      "name": "",
      "macro": ""
    },
    {
      "index": 105,
      "hotkey": "CTRL-SHIFT-F3",
      "name": "",
      "macro": ""
    },
    {
      "index": 106,
      "hotkey": "SHIFT-F1",
      "name": "",
      "macro": ""
    },
    {
      "index": 107,
      "hotkey": "SHIFT-F2",
      "name": "",
      "macro": ""
    },
    {
      "index": 108,
      "hotkey": "SHIFT-F3",
      "name": "",
      "macro": ""
    },
    {
      "index": 109,
      "hotkey": "SHIFT-F4",
      "name": "",
      "macro": ""
    },
    {
      "index": 110,
      "hotkey": "SHIFT-F5",
      "name": "",
      "macro": ""
    },
    {
      "index": 111,
      "hotkey": "SHIFT-F6",
      "name": "",
      "macro": ""
    },
    {
      "index": 112,
      "hotkey": "SHIFT-F7",
      "name": "",
      "macro": ""
    },
    {
      "index": 113,
      "hotkey": "SHIFT-F8",
      "name": "",
      "macro": ""
    },
    {
      "index": 114,
      "hotkey": "SHIFT-F9",
      "name": "",
      "macro": ""
    },
    {
      "index": 115,
      "hotkey": "SHIFT-F10",
      "name": "",
      "macro": ""
    },
    {
      "index": 116,
      "hotkey": "SHIFT-F11",
      "name": "",
      "macro": ""
    },
    {
      "index": 117,
      "hotkey": "SHIFT-F12",
      "name": "",
      "macro": ""
    },
    {
      "index": 118,
      "hotkey": "CTRL-F1",
      "name": "",
      "macro": ""
    },
    {
      "index": 119,
      "hotkey": "CTRL-F2",
      "name": "",
      "macro": ""
    },
    {
      "index": 120,
      "hotkey": "CTRL-F3",
      "name": "",
      "macro": ""
    },
    {
      "index": 121,
      "hotkey": "CTRL-F4",
      "name": "",
      "macro": ""
    },
    {
      "index": 122,
      "hotkey": "CTRL-F5",
      "name": "",
      "macro": ""
    },
    {
      "index": 123,
      "hotkey": "CTRL-F6",
      "name": "",
      "macro": ""
    },
    {
      "index": 124,
      "hotkey": "CTRL-F7",
      "name": "",
      "macro": ""
    },
    {
      "index": 125,
      "hotkey": "CTRL-F8",
      "name": "",
      "macro": ""
    },
    {
      "index": 126,
      "hotkey": "CTRL-F9",
      "name": "",
      "macro": ""
    },
    {
      "index": 127,
      "hotkey": "CTRL-F10",
      "name": "",
      "macro": ""
    },
    {
      "index": 128,
      "hotkey": "CTRL-F11",
      "name": "",
      "macro": ""
    },
    {
      "index": 129,
      "hotkey": "CTRL-F12",
      "name": "",
      "macro": ""
    },
    {
      "index": 130,
      "hotkey": "ALT-F1",
      "name": "",
      "macro": ""
    },
    {
      "index": 131,
      "hotkey": "ALT-F2",
      "name": "",
      "macro": ""
    },
    {
      "index": 132,
      "hotkey": "ALT-F3",
      "name": "",
      "macro": ""
    },
    {
      "index": 133,
      "hotkey": "ALT-F4",
      "name": "",
      "macro": ""
    },
    {
      "index": 134,
      "hotkey": "ALT-F5",
      "name": "",
      "macro": ""
    },
    {
      "index": 135,
      "hotkey": "ALT-F6",
      "name": "",
      "macro": ""
    },
    {
      "index": 136,
      "hotkey": "ALT-F7",
      "name": "",
      "macro": ""
    },
    {
      "index": 137,
      "hotkey": "ALT-F8",
      "name": "",
      "macro": ""
    },
    {
      "index": 138,
      "hotkey": "ALT-F9",
      "name": "",
      "macro": ""
    },
    {
      "index": 139,
      "hotkey": "ALT-F10",
      "name": "",
      "macro": ""
    },
    {
      "index": 140,
      "hotkey": "ALT-F11",
      "name": "",
      "macro": ""
    },
    {
      "index": 141,
      "hotkey": "ALT-F12",
      "name": "",
      "macro": ""
    },
    {
      "index": 142,
      "hotkey": "CTRL-SHIFT-F4",
      "name": "",
      "macro": ""
    },
    {
      "index": 143,
      "hotkey": "CTRL-SHIFT-F5",
      "name": "",
      "macro": ""
    },
    {
      "index": 144,
      "hotkey": "CTRL-SHIFT-F6",
      "name": "",
      "macro": ""
    },
    {
      "index": 145,
      "hotkey": "CTRL-SHIFT-F7",
      "name": "",
      "macro": ""
    },
    {
      "index": 146,
      "hotkey": "CTRL-SHIFT-F8",
      "name": "",
      "macro": ""
    },
    {
      "index": 147,
      "hotkey": "CTRL-SHIFT-F9",
      "name": "",
      "macro": ""
    },
    {
      "index": 148,
      "hotkey": "CTRL-SHIFT-F10",
      "name": "",
      "macro": ""
    },
    {
      "index": 149,
      "hotkey": "CTRL-SHIFT-F11",
      "name": "",
      "macro": ""
    },
    {
      "index": 150,
      "hotkey": "CTRL-SHIFT-F12",
      "name": "",
      "macro": ""
    }
  ],
  "props": [
    {
      "index": 1,
      "name": "射程表",
      "mode": "custom",
      "params": "",
      "libRef": "",
      "code": "-- 当前目标适用各档的最大码数打包（档1 + 档2×100 + 档3×10000 + 档4×1000000，空档 0），无目标 -1。\n-- 读上一拍「射程N」的登记，所以本属性与「射程下限表」要放在射程1..4 之前\nlocal R = SuperDPS.Prop.Range\nR.seal()\nif not UnitExists(\"target\") then return -1 end\nreturn R.pack(\"max\")"
    },
    {
      "index": 2,
      "name": "射程下限表",
      "mode": "custom",
      "params": "",
      "libRef": "",
      "code": "-- 各档技能的最小射程，打包方式同「射程表」；无最小射程的档为 0，无目标 -1。\n-- 有最小射程的档「不在射程内」可能是太近也可能是太远，HUD 结合其他档推理\nif not UnitExists(\"target\") then return -1 end\nreturn SuperDPS.Prop.Range.pack(\"min\")"
    },
    {
      "index": 3,
      "name": "射程1",
      "mode": "custom",
      "params": "2974",
      "libRef": "",
      "code": "-- 参数：敌方检测技能 ID, 友方检测技能 ID（任一可留空 = 对该类目标不检测）。\n-- 返回：3 = 无目标，2 = 本档对当前目标不检测（未填 / 技能无效 / 未学会），\n-- 否则原样回传 C_Spell.IsSpellInRange（目标在 [最小, 最大] 射程内为真；战斗中是秘密布尔，\n-- 条带按 true / false 回传 1 / 0，不可在游戏端判断）\nlocal R = SuperDPS.Prop.Range\nif not UnitExists(\"target\") then R.register(arg1, arg2, nil) return 3 end\nlocal hostile = UnitCanAttack(\"player\", \"target\")\nif issecretvalue and issecretvalue(hostile) then hostile = true end\nlocal id = hostile and arg1 or arg2\nR.register(arg1, arg2, id)\nif not (id and R.lookup(id)) then return 2 end -- 未填或 ID 无效：不检测\nlocal r = C_Spell.IsSpellInRange(id, \"target\")\nif issecretvalue and issecretvalue(r) then return r end\nif r == nil then R.invalid(id) return 2 end\nreturn r"
    },
    {
      "index": 4,
      "name": "射程2",
      "mode": "custom",
      "params": "3044",
      "libRef": "",
      "code": "-- 参数：敌方检测技能 ID, 友方检测技能 ID（任一可留空 = 对该类目标不检测）。\n-- 返回：3 = 无目标，2 = 本档对当前目标不检测（未填 / 技能无效 / 未学会），\n-- 否则原样回传 C_Spell.IsSpellInRange（目标在 [最小, 最大] 射程内为真；战斗中是秘密布尔，\n-- 条带按 true / false 回传 1 / 0，不可在游戏端判断）\nlocal R = SuperDPS.Prop.Range\nif not UnitExists(\"target\") then R.register(arg1, arg2, nil) return 3 end\nlocal hostile = UnitCanAttack(\"player\", \"target\")\nif issecretvalue and issecretvalue(hostile) then hostile = true end\nlocal id = hostile and arg1 or arg2\nR.register(arg1, arg2, id)\nif not (id and R.lookup(id)) then return 2 end -- 未填或 ID 无效：不检测\nlocal r = C_Spell.IsSpellInRange(id, \"target\")\nif issecretvalue and issecretvalue(r) then return r end\nif r == nil then R.invalid(id) return 2 end\nreturn r"
    },
    {
      "index": 5,
      "name": "射程3",
      "mode": "custom",
      "params": "",
      "libRef": "",
      "code": "-- 参数：敌方检测技能 ID, 友方检测技能 ID（任一可留空 = 对该类目标不检测）。\n-- 返回：3 = 无目标，2 = 本档对当前目标不检测（未填 / 技能无效 / 未学会），\n-- 否则原样回传 C_Spell.IsSpellInRange（目标在 [最小, 最大] 射程内为真；战斗中是秘密布尔，\n-- 条带按 true / false 回传 1 / 0，不可在游戏端判断）\nlocal R = SuperDPS.Prop.Range\nif not UnitExists(\"target\") then R.register(arg1, arg2, nil) return 3 end\nlocal hostile = UnitCanAttack(\"player\", \"target\")\nif issecretvalue and issecretvalue(hostile) then hostile = true end\nlocal id = hostile and arg1 or arg2\nR.register(arg1, arg2, id)\nif not (id and R.lookup(id)) then return 2 end -- 未填或 ID 无效：不检测\nlocal r = C_Spell.IsSpellInRange(id, \"target\")\nif issecretvalue and issecretvalue(r) then return r end\nif r == nil then R.invalid(id) return 2 end\nreturn r"
    },
    {
      "index": 6,
      "name": "射程4",
      "mode": "custom",
      "params": "",
      "libRef": "",
      "code": "-- 参数：敌方检测技能 ID, 友方检测技能 ID（任一可留空 = 对该类目标不检测）。\n-- 返回：3 = 无目标，2 = 本档对当前目标不检测（未填 / 技能无效 / 未学会），\n-- 否则原样回传 C_Spell.IsSpellInRange（目标在 [最小, 最大] 射程内为真；战斗中是秘密布尔，\n-- 条带按 true / false 回传 1 / 0，不可在游戏端判断）\nlocal R = SuperDPS.Prop.Range\nif not UnitExists(\"target\") then R.register(arg1, arg2, nil) return 3 end\nlocal hostile = UnitCanAttack(\"player\", \"target\")\nif issecretvalue and issecretvalue(hostile) then hostile = true end\nlocal id = hostile and arg1 or arg2\nR.register(arg1, arg2, id)\nif not (id and R.lookup(id)) then return 2 end -- 未填或 ID 无效：不检测\nlocal r = C_Spell.IsSpellInRange(id, \"target\")\nif issecretvalue and issecretvalue(r) then return r end\nif r == nil then R.invalid(id) return 2 end\nreturn r"
    },
    {
      "index": 7,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 8,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 9,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 10,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 11,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 12,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 13,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 14,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 15,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 16,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 17,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 18,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 19,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 20,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 21,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 22,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 23,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 24,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 25,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 26,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 27,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 28,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 29,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 30,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 31,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 32,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 33,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 34,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 35,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 36,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 37,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 38,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 39,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 40,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 41,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 42,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 43,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 44,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 45,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 46,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 47,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 48,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 49,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 50,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 51,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 52,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 53,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 54,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 55,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 56,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 57,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 58,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 59,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 60,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 61,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 62,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 63,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 64,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 65,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 66,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 67,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 68,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 69,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 70,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 71,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 72,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 73,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 74,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 75,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 76,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 77,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 78,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 79,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 80,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 81,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 82,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 83,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 84,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 85,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 86,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 87,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 88,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 89,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    },
    {
      "index": 90,
      "name": "",
      "mode": "off",
      "params": "",
      "libRef": "",
      "code": ""
    }
  ],
  "luaScripts": [
    {
      "index": 1,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 2,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 3,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 4,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 5,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 6,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 7,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 8,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 9,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 10,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 11,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 12,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 13,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 14,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 15,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 16,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 17,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 18,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 19,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 20,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 21,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 22,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 23,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 24,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 25,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 26,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 27,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 28,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 29,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 30,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 31,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 32,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 33,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 34,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 35,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 36,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 37,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 38,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 39,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 40,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 41,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 42,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 43,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 44,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 45,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 46,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 47,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 48,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 49,
      "id": 0,
      "name": "",
      "code": ""
    },
    {
      "index": 50,
      "id": 0,
      "name": "",
      "code": ""
    }
  ],
  "propLibrary": []
}
