You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1989 lines
80 KiB
1989 lines
80 KiB
-- DruidGuardian.lua
|
|
-- June 2018
|
|
|
|
local addon, ns = ...
|
|
local Hekili = _G[ addon ]
|
|
|
|
local class = Hekili.Class
|
|
local state = Hekili.State
|
|
|
|
local PTR = ns.PTR
|
|
|
|
|
|
-- Conduits
|
|
-- [x] savage_combatant
|
|
-- [ ] unchecked_aggression
|
|
|
|
-- Guardian Endurance
|
|
-- [-] layered_mane
|
|
-- [x] wellhoned_instincts
|
|
|
|
|
|
if UnitClassBase( "player" ) == "DRUID" then
|
|
local spec = Hekili:NewSpecialization( 104 )
|
|
|
|
spec:RegisterResource( Enum.PowerType.Rage, {
|
|
oakhearts_puny_quods = {
|
|
aura = "oakhearts_puny_quods",
|
|
|
|
last = function ()
|
|
local app = state.buff.oakhearts_puny_quods.applied
|
|
local t = state.query_time
|
|
|
|
return app + floor( t - app )
|
|
end,
|
|
|
|
interval = 1,
|
|
value = 10
|
|
},
|
|
|
|
raging_frenzy = {
|
|
aura = "frenzied_regeneration",
|
|
pvptalent = "raging_frenzy",
|
|
|
|
last = function ()
|
|
local app = state.buff.frenzied_regeneration.applied
|
|
local t = state.query_time
|
|
|
|
return app + floor( t - app )
|
|
end,
|
|
|
|
interval = 1,
|
|
value = 10 -- tooltip says 60, meaning this would be 20, but NOPE.
|
|
},
|
|
|
|
thrash_bear = {
|
|
aura = "thrash_bear",
|
|
talent = "blood_frenzy",
|
|
debuff = true,
|
|
|
|
last = function ()
|
|
return state.debuff.thrash_bear.applied + floor( state.query_time - state.debuff.thrash_bear.applied )
|
|
end,
|
|
|
|
interval = function () return class.auras.thrash_bear.tick_time end,
|
|
value = function () return 2 * state.active_dot.thrash_bear end,
|
|
}
|
|
} )
|
|
|
|
spec:RegisterResource( Enum.PowerType.LunarPower )
|
|
spec:RegisterResource( Enum.PowerType.Mana )
|
|
spec:RegisterResource( Enum.PowerType.ComboPoints )
|
|
spec:RegisterResource( Enum.PowerType.Energy )
|
|
|
|
|
|
-- Talents
|
|
spec:RegisterTalents( {
|
|
brambles = 22419, -- 203953
|
|
blood_frenzy = 22418, -- 203962
|
|
bristling_fur = 22420, -- 155835
|
|
|
|
tiger_dash = 19283, -- 252216
|
|
renewal = 18570, -- 108238
|
|
wild_charge = 18571, -- 102401
|
|
|
|
balance_affinity = 22163, -- 197488
|
|
feral_affinity = 22156, -- 202155
|
|
restoration_affinity = 22159, -- 197492
|
|
|
|
mighty_bash = 21778, -- 5211
|
|
mass_entanglement = 18576, -- 102359
|
|
heart_of_the_wild = 18577, -- 319454
|
|
|
|
soul_of_the_forest = 21709, -- 158477
|
|
galactic_guardian = 21707, -- 203964
|
|
incarnation = 22388, -- 102558
|
|
|
|
earthwarden = 22423, -- 203974
|
|
survival_of_the_fittest = 21713, -- 203965
|
|
guardian_of_elune = 22390, -- 155578
|
|
|
|
rend_and_tear = 22426, -- 204053
|
|
lunar_beam = 22427, -- 204066
|
|
pulverize = 22425, -- 80313
|
|
} )
|
|
|
|
|
|
-- PvP Talents
|
|
spec:RegisterPvpTalents( {
|
|
alpha_challenge = 842, -- 207017
|
|
charging_bash = 194, -- 228431
|
|
demoralizing_roar = 52, -- 201664
|
|
den_mother = 51, -- 236180
|
|
emerald_slumber = 197, -- 329042
|
|
entangling_claws = 195, -- 202226
|
|
freedom_of_the_herd = 3750, -- 213200
|
|
grove_protection = 5410, -- 354654
|
|
malornes_swiftness = 1237, -- 236147
|
|
master_shapeshifter = 49, -- 236144
|
|
overrun = 196, -- 202246
|
|
raging_frenzy = 192, -- 236153
|
|
sharpened_claws = 193, -- 202110
|
|
toughness = 50, -- 201259
|
|
} )
|
|
|
|
|
|
local mod_circle_hot = setfenv( function( x )
|
|
return legendary.circle_of_life_and_death.enabled and ( 0.85 * x ) or x
|
|
end, state )
|
|
|
|
local mod_circle_dot = setfenv( function( x )
|
|
return legendary.circle_of_life_and_death.enabled and ( 0.75 * x ) or x
|
|
end, state )
|
|
|
|
|
|
-- Auras
|
|
spec:RegisterAuras( {
|
|
aquatic_form = {
|
|
id = 276012,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
astral_influence = {
|
|
id = 197524,
|
|
},
|
|
barkskin = {
|
|
id = 22812,
|
|
duration = 12,
|
|
max_stack = 1,
|
|
},
|
|
bear_form = {
|
|
id = 5487,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
berserk = {
|
|
id = 50334,
|
|
duration = 15,
|
|
max_stack = 1,
|
|
},
|
|
-- Alias for Berserk vs. Incarnation
|
|
berserk_bear = {
|
|
alias = { "berserk", "incarnation" },
|
|
aliasMode = "first", -- use duration info from the first buff that's up, as they should all be equal.
|
|
aliasType = "buff",
|
|
duration = function () return talent.incarnation.enabled and 30 or 15 end,
|
|
},
|
|
bristling_fur = {
|
|
id = 155835,
|
|
duration = 8,
|
|
max_stack = 1,
|
|
},
|
|
cat_form = {
|
|
id = 768,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
convoke_the_spirits = {
|
|
id = 323764,
|
|
duration = 4,
|
|
max_stack = 1,
|
|
},
|
|
dash = {
|
|
id = 1850,
|
|
duration = 10,
|
|
max_stack = 1,
|
|
},
|
|
earthwarden = {
|
|
id = 203975,
|
|
duration = 3600,
|
|
max_stack = 3,
|
|
},
|
|
entangling_roots = {
|
|
id = 339,
|
|
duration = 30,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
},
|
|
feline_swiftness = {
|
|
id = 131768,
|
|
},
|
|
flight_form = {
|
|
id = 276029,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
frenzied_regeneration = {
|
|
id = 22842,
|
|
duration = 3,
|
|
max_stack = 1,
|
|
},
|
|
galactic_guardian = {
|
|
id = 213708,
|
|
duration = 15,
|
|
max_stack = 1,
|
|
},
|
|
gore = {
|
|
id = 93622,
|
|
duration = 10,
|
|
max_stack = 1,
|
|
},
|
|
growl = {
|
|
id = 6795,
|
|
duration = 3,
|
|
max_stack = 1,
|
|
},
|
|
guardian_of_elune = {
|
|
id = 213680,
|
|
duration = 15,
|
|
max_stack = 1,
|
|
},
|
|
heart_of_the_wild = {
|
|
id = 319454,
|
|
duration = 45,
|
|
max_stack = 1,
|
|
copy = { 319451, 319452, 319453 }
|
|
},
|
|
hibernate = {
|
|
id = 2637,
|
|
duration = 40,
|
|
max_stack = 1,
|
|
},
|
|
immobilized = {
|
|
id = 45334,
|
|
duration = 4,
|
|
max_stack = 1,
|
|
},
|
|
incapacitating_roar = {
|
|
id = 99,
|
|
duration = 3,
|
|
max_stack = 1,
|
|
},
|
|
incarnation = {
|
|
id = 102558,
|
|
duration = 30,
|
|
max_stack = 1,
|
|
copy = "incarnation_guardian_of_ursoc"
|
|
},
|
|
intimidating_roar = {
|
|
id = 236748,
|
|
duration = 3,
|
|
max_stack = 1,
|
|
},
|
|
ironfur = {
|
|
id = 192081,
|
|
duration = function () return buff.guardian_of_elune.up and 9 or 7 end,
|
|
max_stack = 5,
|
|
},
|
|
lightning_reflexes = {
|
|
id = 231065,
|
|
},
|
|
mass_entanglement = {
|
|
id = 102359,
|
|
duration = 30,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
},
|
|
mighty_bash = {
|
|
id = 5211,
|
|
duration = 4,
|
|
max_stack = 1,
|
|
},
|
|
moonfire = {
|
|
id = 164812,
|
|
duration = function () return mod_circle_dot( 16 ) end,
|
|
tick_time = function () return mod_circle_dot( 2 ) * haste end,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
},
|
|
moonkin_form = {
|
|
id = 197625,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
prowl = {
|
|
id = 5215,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
pulverize = {
|
|
id = 80313,
|
|
duration = 10,
|
|
max_stack = 1,
|
|
},
|
|
--[[ rake = {
|
|
id = 155722,
|
|
duration = 15,
|
|
max_stack = 1,
|
|
}, ]]
|
|
regrowth = {
|
|
id = 8936,
|
|
duration = function () return mod_circle_hot( 12 ) end,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
},
|
|
rejuvenation = {
|
|
id = 774,
|
|
duration = function () return mod_circle_hot( 15 ) end,
|
|
tick_time = function () return mod_circle_hot( 3 ) * haste end,
|
|
max_stack = 1,
|
|
},
|
|
soulshape = {
|
|
id = 310143,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
stampeding_roar = {
|
|
id = 77761,
|
|
duration = 8,
|
|
max_stack = 1,
|
|
},
|
|
sunfire = {
|
|
id = 164815,
|
|
duration = function () return mod_circle_dot( 12 ) end,
|
|
tick_time = function () return mod_circle_dot( 2 ) * haste end,
|
|
max_stack = 1,
|
|
type = "Magic",
|
|
},
|
|
survival_instincts = {
|
|
id = 61336,
|
|
duration = 6,
|
|
max_stack = 1,
|
|
},
|
|
thick_hide = {
|
|
id = 16931,
|
|
},
|
|
thrash_bear = {
|
|
id = 192090,
|
|
duration = function () return mod_circle_dot( 15 ) end,
|
|
tick_time = function () return mod_circle_dot( 3 ) * haste end,
|
|
max_stack = function () return legendary.luffainfused_embrace and 4 or 3 end,
|
|
},
|
|
--[[ thrash_cat = {
|
|
id = 106830,
|
|
duration = function () return mod_circle_dot( 15 ) end,
|
|
tick_time = function () return mod_circle_dot( 3 ) * haste end,
|
|
max_stack = 1,
|
|
}, ]]
|
|
tiger_dash = {
|
|
id = 252216,
|
|
duration = 5,
|
|
max_stack = 1,
|
|
},
|
|
tooth_and_claw = {
|
|
id = 135286,
|
|
duration = 15,
|
|
max_stack = 2
|
|
},
|
|
travel_form = {
|
|
id = 783,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
typhoon = {
|
|
id = 61391,
|
|
duration = 6,
|
|
max_stack = 1,
|
|
type = "Magic",
|
|
},
|
|
ursols_vortex = {
|
|
id = 127797,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
wild_charge = {
|
|
id = 102401,
|
|
duration = 0.5,
|
|
max_stack = 1,
|
|
},
|
|
wild_growth = {
|
|
id = 48438,
|
|
duration = 7,
|
|
max_stack = 1,
|
|
},
|
|
yseras_gift = {
|
|
id = 145108,
|
|
},
|
|
|
|
|
|
any_form = {
|
|
alias = { "bear_form", "cat_form", "moonkin_form" },
|
|
duration = 3600,
|
|
aliasMode = "first",
|
|
aliasType = "buff",
|
|
},
|
|
|
|
|
|
-- PvP Talents
|
|
demoralizing_roar = {
|
|
id = 201664,
|
|
duration = 8,
|
|
max_stack = 1,
|
|
},
|
|
|
|
den_mother = {
|
|
id = 236181,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
|
|
focused_assault = {
|
|
id = 206891,
|
|
duration = 6,
|
|
max_stack = 1,
|
|
},
|
|
|
|
grove_protection_defense = {
|
|
id = 354704,
|
|
duration = 12,
|
|
max_stack = 1,
|
|
},
|
|
|
|
grove_protection_offense = {
|
|
id = 354789,
|
|
duration = 12,
|
|
max_stack = 1,
|
|
},
|
|
|
|
master_shapeshifter_feral = {
|
|
id = 236188,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
|
|
overrun = {
|
|
id = 202244,
|
|
duration = 3,
|
|
max_stack = 1,
|
|
},
|
|
|
|
protector_of_the_pack = {
|
|
id = 201940,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
|
|
sharpened_claws = {
|
|
id = 279943,
|
|
duration = 6,
|
|
max_stack = 1,
|
|
},
|
|
|
|
-- Azerite
|
|
masterful_instincts = {
|
|
id = 273349,
|
|
duration = 30,
|
|
max_stack = 1,
|
|
},
|
|
|
|
-- Legendary
|
|
lycaras_fleeting_glimpse = {
|
|
id = 340060,
|
|
duration = 5,
|
|
max_stack = 1
|
|
},
|
|
ursocs_fury_remembered = {
|
|
id = 345048,
|
|
duration = 15,
|
|
max_stack = 1,
|
|
},
|
|
} )
|
|
|
|
|
|
-- Function to remove any form currently active.
|
|
spec:RegisterStateFunction( "unshift", function()
|
|
if conduit.tireless_pursuit.enabled and ( buff.cat_form.up or buff.travel_form.up ) then applyBuff( "tireless_pursuit" ) end
|
|
|
|
removeBuff( "cat_form" )
|
|
removeBuff( "bear_form" )
|
|
removeBuff( "travel_form" )
|
|
removeBuff( "moonkin_form" )
|
|
removeBuff( "travel_form" )
|
|
removeBuff( "aquatic_form" )
|
|
removeBuff( "stag_form" )
|
|
|
|
if legendary.oath_of_the_elder_druid.enabled and debuff.oath_of_the_elder_druid_icd.down and talent.restoration_affinity.enabled then
|
|
applyBuff( "heart_of_the_wild" )
|
|
applyDebuff( "player", "oath_of_the_elder_druid_icd" )
|
|
end
|
|
end )
|
|
|
|
|
|
local affinities = {
|
|
bear_form = "guardian_affinity",
|
|
cat_form = "feral_affinity",
|
|
moonkin_form = "balance_affinity",
|
|
}
|
|
|
|
-- Function to apply form that is passed into it via string.
|
|
spec:RegisterStateFunction( "shift", function( form )
|
|
if conduit.tireless_pursuit.enabled and ( buff.cat_form.up or buff.travel_form.up ) then applyBuff( "tireless_pursuit" ) end
|
|
|
|
removeBuff( "cat_form" )
|
|
removeBuff( "bear_form" )
|
|
removeBuff( "travel_form" )
|
|
removeBuff( "moonkin_form" )
|
|
removeBuff( "travel_form" )
|
|
removeBuff( "aquatic_form" )
|
|
removeBuff( "stag_form" )
|
|
applyBuff( form )
|
|
|
|
if affinities[ form ] and legendary.oath_of_the_elder_druid.enabled and debuff.oath_of_the_elder_druid_icd.down and talent[ affinities[ form ] ].enabled then
|
|
applyBuff( "heart_of_the_wild" )
|
|
applyDebuff( "player", "oath_of_the_elder_druid_icd" )
|
|
end
|
|
end )
|
|
|
|
spec:RegisterStateExpr( "ironfur_damage_threshold", function ()
|
|
return ( settings.ironfur_damage_threshold or 0 ) / 100 * ( health.max )
|
|
end )
|
|
|
|
|
|
-- Gear.
|
|
spec:RegisterGear( "class", 139726, 139728, 139723, 139730, 139725, 139729, 139727, 139724 )
|
|
spec:RegisterGear( "tier19", 138330, 138336, 138366, 138324, 138327, 138333 )
|
|
spec:RegisterGear( "tier20", 147136, 147138, 147134, 147133, 147135, 147137 ) -- Bonuses NYI
|
|
spec:RegisterGear( "tier21", 152127, 152129, 152125, 152124, 152126, 152128 )
|
|
|
|
spec:RegisterGear( "ailuro_pouncers", 137024 )
|
|
spec:RegisterGear( "behemoth_headdress", 151801 )
|
|
spec:RegisterGear( "chatoyant_signet", 137040 )
|
|
spec:RegisterGear( "dual_determination", 137041 )
|
|
spec:RegisterGear( "ekowraith_creator_of_worlds", 137015 )
|
|
spec:RegisterGear( "elizes_everlasting_encasement", 137067 )
|
|
spec:RegisterGear( "fiery_red_maimers", 144354 )
|
|
spec:RegisterGear( "lady_and_the_child", 144295 )
|
|
spec:RegisterGear( "luffa_wrappings", 137056 )
|
|
spec:RegisterGear( "oakhearts_puny_quods", 144432 )
|
|
spec:RegisterAura( "oakhearts_puny_quods", {
|
|
id = 236479,
|
|
duration = 3,
|
|
max_stack = 1,
|
|
} )
|
|
spec:RegisterGear( "skysecs_hold", 137025 )
|
|
spec:RegisterAura( "skysecs_hold", {
|
|
id = 208218,
|
|
duration = 3,
|
|
max_stack = 1,
|
|
} )
|
|
|
|
spec:RegisterGear( "the_wildshapers_clutch", 137094 )
|
|
|
|
spec:RegisterGear( "soul_of_the_archdruid", 151636 )
|
|
|
|
|
|
spec:RegisterStateExpr( "lunar_eclipse", function ()
|
|
return eclipse.wrath_counter
|
|
end )
|
|
|
|
spec:RegisterStateExpr( "solar_eclipse", function ()
|
|
return eclipse.starfire_counter
|
|
end )
|
|
|
|
local LycarasHandler = setfenv( function ()
|
|
if buff.travel_form.up then state:RunHandler( "stampeding_roar" )
|
|
elseif buff.moonkin_form.up then state:RunHandler( "starfall" )
|
|
elseif buff.bear_form.up then state:RunHandler( "barkskin" )
|
|
elseif buff.cat_form.up then state:RunHandler( "primal_wrath" )
|
|
else state:RunHandle( "wild_growth" ) end
|
|
end, state )
|
|
|
|
local SinfulHysteriaHandler = setfenv( function ()
|
|
applyBuff( "ravenous_frenzy_sinful_hysteria" )
|
|
end, state )
|
|
|
|
spec:RegisterHook( "reset_precast", function ()
|
|
if azerite.masterful_instincts.enabled and buff.survival_instincts.up and buff.masterful_instincts.down then
|
|
applyBuff( "masterful_instincts", buff.survival_instincts.remains + 30 )
|
|
end
|
|
|
|
if buff.lycaras_fleeting_glimpse.up then
|
|
state:QueueAuraExpiration( "lycaras_fleeting_glimpse", LycarasHandler, buff.lycaras_fleeting_glimpse.expires )
|
|
end
|
|
|
|
if legendary.sinful_hysteria.enabled and buff.ravenous_frenzy.up then
|
|
state:QueueAuraExpiration( "ravenous_frenzy", SinfulHysteriaHandler, buff.ravenous_frenzy.expires )
|
|
end
|
|
|
|
eclipse.reset() -- from Balance.
|
|
end )
|
|
|
|
|
|
spec:RegisterHook( "runHandler", function( ability )
|
|
local a = class.abilities[ ability ]
|
|
|
|
if not a or a.startsCombat then
|
|
break_stealth()
|
|
end
|
|
|
|
if buff.ravenous_frenzy.up and ability ~= "ravenous_frenzy" then
|
|
addStack( "ravenous_frenzy", nil, 1 )
|
|
end
|
|
end )
|
|
|
|
|
|
spec:RegisterStateTable( "druid", setmetatable( {
|
|
}, {
|
|
__index = function( t, k )
|
|
if k == "catweave_bear" then
|
|
return talent.feral_affinity.enabled and settings.catweave_bear
|
|
elseif k == "owlweave_bear" then
|
|
return talent.balance_affinity.enabled and settings.owlweave_bear
|
|
elseif k == "no_cds" then return not toggle.cooldowns
|
|
elseif k == "primal_wrath" then return debuff.rip
|
|
elseif k == "lunar_inspiration" then return debuff.moonfire_cat
|
|
elseif debuff[ k ] ~= nil then return debuff[ k ]
|
|
end
|
|
end
|
|
} ) )
|
|
|
|
|
|
-- Abilities
|
|
spec:RegisterAbilities( {
|
|
alpha_challenge = {
|
|
id = 207017,
|
|
cast = 0,
|
|
cooldown = 20,
|
|
gcd = "spell",
|
|
|
|
pvptalent = "alpha_challenge",
|
|
|
|
startsCombat = true,
|
|
texture = 132270,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "focused_assault" )
|
|
end,
|
|
},
|
|
|
|
|
|
barkskin = {
|
|
id = 22812,
|
|
cast = 0,
|
|
cooldown = function () return ( talent.survival_of_the_fittest.enabled and 40 or 60 ) * ( 1 + ( conduit.tough_as_bark.mod * 0.01 ) ) end,
|
|
gcd = "off",
|
|
|
|
startsCombat = false,
|
|
texture = 136097,
|
|
|
|
toggle = "defensives",
|
|
defensive = true,
|
|
|
|
usable = function ()
|
|
if not tanking then return false, "player is not tanking right now"
|
|
elseif incoming_damage_3s == 0 then return false, "player has taken no damage in 3s" end
|
|
return true
|
|
end,
|
|
handler = function ()
|
|
applyBuff( "barkskin" )
|
|
|
|
if legendary.the_natural_orders_will.enabled and buff.bear_form.up then
|
|
applyBuff( "ironfur" )
|
|
applyBuff( "frenzied_regeneration" )
|
|
end
|
|
end,
|
|
},
|
|
|
|
|
|
bear_form = {
|
|
id = 5487,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = -25,
|
|
spendType = "rage",
|
|
|
|
startsCombat = false,
|
|
texture = 132276,
|
|
|
|
essential = true,
|
|
noform = "bear_form",
|
|
|
|
handler = function ()
|
|
shift( "bear_form" )
|
|
if conduit.ursine_vigor.enabled then applyBuff( "ursine_vigor" ) end
|
|
end,
|
|
},
|
|
|
|
|
|
berserk = {
|
|
id = 50334,
|
|
cast = 0,
|
|
cooldown = function () return legendary.legacy_of_the_sleeper.enabled and 150 or 180 end,
|
|
gcd = "off",
|
|
|
|
toggle = "cooldowns",
|
|
|
|
startsCombat = true,
|
|
texture = 236149,
|
|
|
|
notalent = "incarnation",
|
|
|
|
handler = function ()
|
|
applyBuff( "berserk" )
|
|
end,
|
|
|
|
copy = "berserk_bear"
|
|
},
|
|
|
|
|
|
bristling_fur = {
|
|
id = 155835,
|
|
cast = 0,
|
|
cooldown = 40,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 1033476,
|
|
|
|
talent = "bristling_fur",
|
|
|
|
usable = function ()
|
|
if incoming_damage_3s < health.max * 0.1 then return false, "player has not taken 10% health in dmg in 3s" end
|
|
return true
|
|
end,
|
|
handler = function ()
|
|
applyBuff( "bristling_fur" )
|
|
end,
|
|
},
|
|
|
|
|
|
cat_form = {
|
|
id = 768,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 132115,
|
|
|
|
noform = "cat_form",
|
|
|
|
handler = function ()
|
|
shift( "cat_form" )
|
|
if pvptalent.master_shapeshifter.enabled and talent.feral_affinity.enabled then
|
|
applyBuff( "master_shapeshifter_feral" )
|
|
end
|
|
end,
|
|
},
|
|
|
|
|
|
cyclone = {
|
|
id = 33786,
|
|
cast = 1.7,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.1,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 136022,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "cyclone" )
|
|
end,
|
|
},
|
|
|
|
|
|
dash = {
|
|
id = 1850,
|
|
cast = 0,
|
|
cooldown = 120,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 132120,
|
|
|
|
handler = function ()
|
|
shift( "cat_form" )
|
|
applyBuff( "dash" )
|
|
end,
|
|
},
|
|
|
|
|
|
demoralizing_roar = {
|
|
id = 201664,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
|
|
pvptalent = "demoralizing_roar",
|
|
|
|
startsCombat = true,
|
|
texture = 132117,
|
|
|
|
handler = function ()
|
|
applyDebuff( "demoralizing_roar" )
|
|
active_dot.demoralizing_roar = active_enemies
|
|
end,
|
|
},
|
|
|
|
|
|
emerald_slumber = {
|
|
id = 329042,
|
|
cast = 8,
|
|
cooldown = 120,
|
|
channeled = true,
|
|
gcd = "spell",
|
|
|
|
toggle = "cooldowns",
|
|
pvptalent = "emerald_slumber",
|
|
|
|
startsCombat = false,
|
|
texture = 1394953,
|
|
|
|
handler = function ()
|
|
end,
|
|
},
|
|
|
|
|
|
entangling_roots = {
|
|
id = 339,
|
|
cast = function () return pvptalent.entangling_claws.enabled and 0 or 1.7 end,
|
|
cooldown = function () return pvptalent.entangling_claws.enabled and 6 or 0 end,
|
|
gcd = "spell",
|
|
|
|
spend = 0.06,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 136100,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "entangling_roots" )
|
|
end,
|
|
},
|
|
|
|
|
|
--[[ ferocious_bite = {
|
|
id = 22568,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = function () return args.max_energy == 1 and 50 or 25 end,
|
|
spendType = "energy",
|
|
|
|
startsCombat = true,
|
|
texture = 132127,
|
|
|
|
form = "cat_form",
|
|
|
|
usable = function ()
|
|
if combo_points.current == 0 then return false, "player has no combo points" end
|
|
return true
|
|
end,
|
|
|
|
handler = function ()
|
|
spend( min( 5, combo_points.current ), "combo_points" )
|
|
end,
|
|
}, ]]
|
|
|
|
|
|
frenzied_regeneration = {
|
|
id = 22842,
|
|
cast = 0,
|
|
charges = 2,
|
|
cooldown = function () return buff.berserk_bear.up and ( level > 57 and 9 or 18 ) or 36 end,
|
|
recharge = function () return buff.berserk_bear.up and ( level > 57 and 9 or 18 ) or 36 end,
|
|
hasteCD = true,
|
|
gcd = "spell",
|
|
|
|
spend = 10,
|
|
spendType = "rage",
|
|
|
|
startsCombat = false,
|
|
texture = 132091,
|
|
|
|
toggle = "defensives",
|
|
defensive = true,
|
|
|
|
form = "bear_form",
|
|
nobuff = "frenzied_regeneration",
|
|
|
|
handler = function ()
|
|
applyBuff( "frenzied_regeneration" )
|
|
gain( health.max * 0.08, "health" )
|
|
end,
|
|
|
|
auras = {
|
|
-- Conduit (ICD)
|
|
wellhoned_instincts = {
|
|
id = 340556,
|
|
duration = function ()
|
|
if conduit.wellhoned_instincts.enabled then return conduit.wellhoned_instincts.mod end
|
|
return 90
|
|
end,
|
|
max_stack = 1
|
|
}
|
|
}
|
|
},
|
|
|
|
grove_protection = {
|
|
id = 354654,
|
|
cast = 0,
|
|
cooldown = 60,
|
|
gcd = "spell",
|
|
|
|
toggle = "defensives",
|
|
|
|
startsCombat = false,
|
|
texture = 4067364,
|
|
|
|
handler = function ()
|
|
-- Don't apply auras; position dependent.
|
|
end,
|
|
},
|
|
|
|
|
|
growl = {
|
|
id = 6795,
|
|
cast = 0,
|
|
cooldown = function () return buff.berserk_bear.up and ( level > 57 and 2 or 4 ) or 8 end,
|
|
gcd = "spell",
|
|
|
|
nopvptalent = "alpha_challenge",
|
|
|
|
startsCombat = true,
|
|
texture = 132270,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "growl" )
|
|
end,
|
|
},
|
|
|
|
|
|
heart_of_the_wild = {
|
|
id = 319454,
|
|
cast = 0,
|
|
cooldown = function () return 300 * ( 1 - ( conduit.born_of_the_wilds.mod * 0.01 ) ) end,
|
|
gcd = "spell",
|
|
|
|
toggle = "cooldowns",
|
|
|
|
startsCombat = false,
|
|
texture = 135879,
|
|
|
|
handler = function ()
|
|
applyBuff( "heart_of_the_wild" )
|
|
|
|
if talent.balance_affinity.enabled then
|
|
shift( "moonkin_form" )
|
|
elseif talent.feral_affinity.enabled then
|
|
shift( "cat_form" )
|
|
elseif talent.restoration_affinity.enabled then
|
|
unshift()
|
|
end
|
|
end,
|
|
},
|
|
|
|
|
|
hibernate = {
|
|
id = 2637,
|
|
cast = 1.5,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.06,
|
|
spendType = "mana",
|
|
|
|
startsCombat = false,
|
|
texture = 136090,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "hibernate" )
|
|
end,
|
|
},
|
|
|
|
|
|
incapacitating_roar = {
|
|
id = 99,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
texture = 132121,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "incapacitating_roar" )
|
|
end,
|
|
},
|
|
|
|
|
|
incarnation = {
|
|
id = 102558,
|
|
cast = 0,
|
|
cooldown = function () return legendary.legacy_of_the_sleeper.enabled and 150 or 180 end,
|
|
gcd = "off",
|
|
|
|
toggle = "cooldowns",
|
|
|
|
startsCombat = false,
|
|
texture = 571586,
|
|
|
|
talent = "incarnation",
|
|
|
|
handler = function ()
|
|
applyBuff( "incarnation" )
|
|
end,
|
|
|
|
copy = { "incarnation_guardian_of_ursoc", "Incarnation" }
|
|
},
|
|
|
|
|
|
ironfur = {
|
|
id = 192081,
|
|
cast = 0,
|
|
cooldown = 0.5,
|
|
gcd = "off",
|
|
|
|
spend = function () return buff.berserk_bear.up and 20 or 40 end,
|
|
spendType = "rage",
|
|
|
|
startsCombat = false,
|
|
texture = 1378702,
|
|
|
|
toggle = "defensives",
|
|
defensive = true,
|
|
|
|
form = "bear_form",
|
|
|
|
usable = function ()
|
|
if not tanking then return false, "player is not tanking right now"
|
|
elseif incoming_damage_3s == 0 then return false, "player has taken no damage in 3s" end
|
|
return true
|
|
end,
|
|
|
|
handler = function ()
|
|
applyBuff( "ironfur" )
|
|
removeBuff( "guardian_of_elune" )
|
|
end,
|
|
},
|
|
|
|
|
|
lunar_beam = {
|
|
id = 204066,
|
|
cast = 0,
|
|
cooldown = 75,
|
|
gcd = "spell",
|
|
|
|
toggle = "defensives",
|
|
|
|
startsCombat = true,
|
|
texture = 136057,
|
|
|
|
talent = "lunar_beam",
|
|
|
|
handler = function ()
|
|
applyBuff( "lunar_beam" )
|
|
end,
|
|
|
|
auras = {
|
|
lunar_beam = {
|
|
duration = 8,
|
|
max_stack = 1,
|
|
|
|
generate = function( t )
|
|
local applied = action.lunar_beam.lastCast
|
|
|
|
if not t.name then t.name = class.auras.lunar_beam.name end
|
|
|
|
if applied and now - applied < 8 then
|
|
t.count = 1
|
|
t.expires = applied + 8
|
|
t.applied = applied
|
|
t.caster = "player"
|
|
return
|
|
end
|
|
|
|
t.count = 0
|
|
t.expires = 0
|
|
t.applied = 0
|
|
t.caster = "nobody"
|
|
end,
|
|
},
|
|
}
|
|
},
|
|
|
|
|
|
maim = {
|
|
id = 22570,
|
|
cast = 0,
|
|
cooldown = 20,
|
|
gcd = "spell",
|
|
|
|
spend = 30,
|
|
spendType = "energy",
|
|
|
|
startsCombat = true,
|
|
texture = 132134,
|
|
|
|
talent = "feral_affinity",
|
|
form = "cat_form",
|
|
|
|
usable = function () return combo_points.current > 0, "requires combo_points" end,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "maim", combo_points.current )
|
|
spend( combo_points.current, "combo_points" )
|
|
end,
|
|
},
|
|
|
|
|
|
mangle = {
|
|
id = 33917,
|
|
cast = 0,
|
|
cooldown = function () return ( buff.berserk_bear.up and ( level > 57 and 1.5 or 3 ) or 6 ) * haste end,
|
|
gcd = "spell",
|
|
|
|
spend = function () return buff.gore.up and -19 or -15 end,
|
|
spendType = "rage",
|
|
|
|
startsCombat = true,
|
|
texture = 132135,
|
|
|
|
form = "bear_form",
|
|
|
|
handler = function ()
|
|
if talent.guardian_of_elune.enabled then applyBuff( "guardian_of_elune" ) end
|
|
removeBuff( "gore" )
|
|
|
|
if conduit.savage_combatant.enabled then addStack( "savage_combatant", nil, 1 ) end
|
|
end,
|
|
|
|
auras = {
|
|
-- Conduit
|
|
savage_combatant = {
|
|
id = 340613,
|
|
duration = 15,
|
|
max_stack = 3
|
|
}
|
|
}
|
|
},
|
|
|
|
|
|
mass_entanglement = {
|
|
id = 102359,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 538515,
|
|
|
|
talent = "mass_entanglement",
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "mass_entanglement" )
|
|
end,
|
|
},
|
|
|
|
|
|
maul = {
|
|
id = 6807,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 40,
|
|
spendType = "rage",
|
|
|
|
startsCombat = true,
|
|
texture = 132136,
|
|
|
|
form = "bear_form",
|
|
|
|
usable = function ()
|
|
if settings.maul_rage > 0 and rage.current - cost < settings.maul_rage then return false, "not enough additional rage" end
|
|
return true
|
|
end,
|
|
|
|
handler = function ()
|
|
if pvptalent.sharpened_claws.enabled or essence.conflict_and_strife.major then applyBuff( "sharpened_claws" ) end
|
|
removeBuff( "savage_combatant" )
|
|
end,
|
|
},
|
|
|
|
|
|
mighty_bash = {
|
|
id = 5211,
|
|
cast = 0,
|
|
cooldown = 60,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
texture = 132114,
|
|
|
|
talent = "mighty_bash",
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "mighty_bash" )
|
|
end,
|
|
},
|
|
|
|
|
|
moonfire = {
|
|
id = 8921,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.06,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 136096,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "moonfire" )
|
|
|
|
if buff.galactic_guardian.up then
|
|
gain( 8, "rage" )
|
|
removeBuff( "galactic_guardian" )
|
|
end
|
|
end,
|
|
},
|
|
|
|
|
|
moonkin_form = {
|
|
id = 197625,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 136036,
|
|
|
|
noform = "moonkin_form",
|
|
talent = "balance_affinity",
|
|
|
|
handler = function ()
|
|
shift( "moonkin_form" )
|
|
end,
|
|
},
|
|
|
|
|
|
overrun = {
|
|
id = 202246,
|
|
cast = 0,
|
|
cooldown = 25,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
texture = 1408833,
|
|
|
|
pvptalent = "overrun",
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "overrun" )
|
|
setDistance( 5 )
|
|
end,
|
|
},
|
|
|
|
|
|
prowl = {
|
|
id = 5215,
|
|
cast = 0,
|
|
cooldown = 6,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 514640,
|
|
|
|
usable = function ()
|
|
if time > 0 and ( not boss or not buff.shadowmeld.up ) then return false, "cannot stealth in combat"
|
|
elseif buff.prowl.up then return false, "player is already prowling" end
|
|
return true
|
|
end,
|
|
|
|
handler = function ()
|
|
shift( "cat_form" )
|
|
applyBuff( "prowl" )
|
|
end,
|
|
},
|
|
|
|
|
|
pulverize = {
|
|
id = 80313,
|
|
cast = 0,
|
|
cooldown = 45,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
texture = 1033490,
|
|
|
|
talent = "pulverize",
|
|
form = "bear_form",
|
|
|
|
usable = function ()
|
|
if debuff.thrash_bear.stack < 2 then return false, "target has fewer than 2 thrash stacks" end
|
|
return true
|
|
end,
|
|
|
|
handler = function ()
|
|
if debuff.thrash_bear.count > 2 then debuff.thrash_bear.count = debuff.thrash_bear.count - 2
|
|
else removeDebuff( "target", "thrash_bear" ) end
|
|
applyBuff( "pulverize" )
|
|
end,
|
|
},
|
|
|
|
|
|
--[[ rake = {
|
|
id = 1822,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 35,
|
|
spendType = "energy",
|
|
|
|
startsCombat = true,
|
|
texture = 132122,
|
|
|
|
talent = "feral_affinity",
|
|
form = "cat_form",
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "rake" )
|
|
debuff.rake.pmultiplier = persistent_multiplier
|
|
|
|
gain( 1, "combo_points" )
|
|
end,
|
|
}, ]]
|
|
|
|
|
|
--[[ rebirth = {
|
|
id = 20484,
|
|
cast = 2,
|
|
cooldown = 600,
|
|
gcd = "spell",
|
|
|
|
spend = 0,
|
|
spendType = "rage",
|
|
|
|
startsCombat = true,
|
|
texture = 136080,
|
|
|
|
handler = function ()
|
|
end,
|
|
}, ]]
|
|
|
|
|
|
regrowth = {
|
|
id = 8936,
|
|
cast = 1.5,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.14,
|
|
spendType = "mana",
|
|
|
|
startsCombat = false,
|
|
texture = 136085,
|
|
|
|
talent = "restoration_affinity",
|
|
usable = function ()
|
|
if not ( buff.bear_form.down and buff.cat_form.down and buff.travel_form.down and buff.moonkin_form.down ) then return false, "player is in a form" end
|
|
return true
|
|
end,
|
|
|
|
handler = function ()
|
|
applyBuff( "regrowth" )
|
|
end,
|
|
},
|
|
|
|
|
|
rejuvenation = {
|
|
id = 774,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.1,
|
|
spendType = "mana",
|
|
|
|
startsCombat = false,
|
|
texture = 136081,
|
|
|
|
talent = "restoration_affinity",
|
|
|
|
usable = function ()
|
|
if not ( buff.bear_form.down and buff.cat_form.down and buff.travel_form.down and buff.moonkin_form.down ) then return false, "player is in a form" end
|
|
return true
|
|
end,
|
|
handler = function ()
|
|
applyBuff( "rejuvenation" )
|
|
end,
|
|
},
|
|
|
|
|
|
remove_corruption = {
|
|
id = 2782,
|
|
cast = 0,
|
|
cooldown = 8,
|
|
gcd = "spell",
|
|
|
|
spend = 0.06,
|
|
spendType = "mana",
|
|
|
|
startsCombat = false,
|
|
texture = 135952,
|
|
|
|
usable = function ()
|
|
if buff.dispellable_poison.down and buff.dispellable_curse.down then return false, "player has no dispellable auras" end
|
|
return true
|
|
end,
|
|
handler = function ()
|
|
removeBuff( "dispellable_poison" )
|
|
removeBuff( "dispellable_curse" )
|
|
end,
|
|
},
|
|
|
|
|
|
renewal = {
|
|
id = 108238,
|
|
cast = 0,
|
|
cooldown = 90,
|
|
gcd = "spell",
|
|
|
|
toggle = "defensives",
|
|
defensive = true,
|
|
|
|
startsCombat = true,
|
|
texture = 136059,
|
|
|
|
talent = "renewal",
|
|
|
|
handler = function ()
|
|
gain( 0.3 * health.max, "health" )
|
|
end,
|
|
},
|
|
|
|
|
|
|
|
--[[ revive = {
|
|
id = 50769,
|
|
cast = 10,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.04,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 132132,
|
|
|
|
handler = function ()
|
|
end,
|
|
}, ]]
|
|
|
|
|
|
--[[ rip = {
|
|
id = 1079,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 30,
|
|
spendType = "energy",
|
|
|
|
startsCombat = true,
|
|
texture = 132152,
|
|
|
|
talent = "feral_affinity",
|
|
form = "cat_form",
|
|
|
|
usable = function ()
|
|
if combo_points.current == 0 then return false, "player has no combo points" end
|
|
return true
|
|
end,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "rip" )
|
|
end,
|
|
}, ]]
|
|
|
|
|
|
--[[ shred = {
|
|
id = 5221,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 40,
|
|
spendType = "energy",
|
|
|
|
startsCombat = true,
|
|
texture = 136231,
|
|
|
|
handler = function ()
|
|
end,
|
|
}, ]]
|
|
|
|
|
|
skull_bash = {
|
|
id = 106839,
|
|
cast = 0,
|
|
cooldown = 15,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
texture = 236946,
|
|
|
|
toggle = "interrupts",
|
|
|
|
debuff = "casting",
|
|
readyTime = state.timeToInterrupt,
|
|
|
|
handler = function ()
|
|
interrupt()
|
|
end,
|
|
},
|
|
|
|
|
|
soothe = {
|
|
id = 2908,
|
|
cast = 0,
|
|
cooldown = 10,
|
|
gcd = "spell",
|
|
|
|
spend = 0.06,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 132163,
|
|
|
|
debuff = "dispellable_enrage",
|
|
|
|
handler = function ()
|
|
removeDebuff( "target", "dispellable_enrage" )
|
|
end,
|
|
},
|
|
|
|
|
|
stampeding_roar = {
|
|
id = 106898,
|
|
cast = 0,
|
|
cooldown = function () return pvptalent.freedom_of_the_herd.enabled and 0 or 60 end,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 464343,
|
|
|
|
handler = function ()
|
|
applyBuff( "stampeding_roar" )
|
|
if buff.bear_form.down and buff.cat_form.down then
|
|
shift( "bear_form" )
|
|
end
|
|
end,
|
|
},
|
|
|
|
|
|
--[[ starfire = {
|
|
id = 197628,
|
|
cast = 2.5,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.03,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 135753,
|
|
|
|
talent = "balance_affinity",
|
|
form = "moonkin_form",
|
|
|
|
handler = function ()
|
|
end,
|
|
}, ]]
|
|
|
|
|
|
starsurge = {
|
|
id = 197626,
|
|
cast = function () return buff.heart_of_the_wild.up and 0 or 2 end,
|
|
cooldown = 10,
|
|
gcd = "spell",
|
|
|
|
spend = 0.03,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 135730,
|
|
|
|
talent = "balance_affinity",
|
|
form = "moonkin_form",
|
|
|
|
handler = function ()
|
|
addStack( "lunar_empowerment" )
|
|
addStack( "solar_empowerment" )
|
|
end,
|
|
},
|
|
|
|
|
|
sunfire = {
|
|
id = 197630,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.12,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 236216,
|
|
|
|
talent = "balance_affinity",
|
|
form = "moonkin_form",
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "sunfire" )
|
|
active_dot.sunfire = active_enemies
|
|
end,
|
|
},
|
|
|
|
|
|
survival_instincts = {
|
|
id = 61336,
|
|
cast = 0,
|
|
charges = 2,
|
|
cooldown = function () return ( essence.vision_of_perfection.enabled and 0.87 or 1 ) * ( talent.survival_of_the_fittest.enabled and ( 2/3 ) or 1 ) * 180 end,
|
|
recharge = function () return ( essence.vision_of_perfection.enabled and 0.87 or 1 ) * ( talent.survival_of_the_fittest.enabled and ( 2/3 ) or 1 ) * 180 end,
|
|
gcd = "off",
|
|
|
|
startsCombat = false,
|
|
texture = 236169,
|
|
|
|
toggle = "defensives",
|
|
defensive = true,
|
|
|
|
usable = function ()
|
|
if not tanking then return false, "player is not tanking right now"
|
|
elseif incoming_damage_3s == 0 then return false, "player has taken no damage in 3s" end
|
|
return true
|
|
end,
|
|
|
|
handler = function ()
|
|
applyBuff( "survival_instincts" )
|
|
|
|
if azerite.masterful_instincts.enabled and buff.survival_instincts.up and buff.masterful_instincts.down then
|
|
applyBuff( "masterful_instincts", buff.survival_instincts.remains + 30 )
|
|
end
|
|
end,
|
|
},
|
|
|
|
|
|
swiftmend = {
|
|
id = 18562,
|
|
cast = 0,
|
|
charges = 1,
|
|
cooldown = 25,
|
|
recharge = 25,
|
|
gcd = "spell",
|
|
|
|
spend = 0.14,
|
|
spendType = "mana",
|
|
|
|
startsCombat = false,
|
|
texture = 134914,
|
|
|
|
talent = "restoration_affinity",
|
|
toggle = "defensives",
|
|
defensive = true,
|
|
|
|
usable = function ()
|
|
return IsSpellUsable( 18562 ) or buff.regrowth.up or buff.wild_growth.up or buff.rejuvenation.up, "requires a HoT"
|
|
end,
|
|
|
|
handler = function ()
|
|
unshift()
|
|
if buff.regrowth.up then removeBuff( "regrowth" )
|
|
elseif buff.wild_growth.up then removeBuff( "wild_growth" )
|
|
elseif buff.rejuvenation.up then removeBuff( "rejuvenation" ) end
|
|
end,
|
|
},
|
|
|
|
|
|
swipe_bear = {
|
|
id = 213771,
|
|
known = 213764,
|
|
suffix = "(Bear)",
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
texture = 134296,
|
|
|
|
form = "bear_form",
|
|
|
|
handler = function ()
|
|
end,
|
|
|
|
copy = { "swipe", 213764 },
|
|
bind = { "swipe_bear", "swipe_cat", "swipe" }
|
|
},
|
|
|
|
|
|
--[[ teleport_moonglade = {
|
|
id = 18960,
|
|
cast = 10,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 4,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 135758,
|
|
|
|
handler = function ()
|
|
end,
|
|
}, ]]
|
|
|
|
|
|
thrash_bear = {
|
|
id = 77758,
|
|
known = 106832,
|
|
suffix = "(Bear)",
|
|
cast = 0,
|
|
cooldown = function () return ( buff.berserk_bear.up and ( level > 57 and 1.5 or 3 ) or 6 ) * haste end,
|
|
gcd = "spell",
|
|
|
|
spend = -5,
|
|
spendType = "rage",
|
|
|
|
startsCombat = true,
|
|
texture = 451161,
|
|
|
|
form = "bear_form",
|
|
bind = "thrash",
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "thrash_bear", 15, debuff.thrash_bear.count + 1 )
|
|
active_dot.thrash_bear = active_enemies
|
|
|
|
if legendary.ursocs_fury_remembered.enabled then
|
|
applyBuff( "ursocs_fury_remembered" )
|
|
end
|
|
end,
|
|
},
|
|
|
|
|
|
tiger_dash = {
|
|
id = 252216,
|
|
cast = 0,
|
|
cooldown = 45,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 1817485,
|
|
|
|
talent = "tiger_dash",
|
|
|
|
handler = function ()
|
|
applyBuff( "tiger_dash" )
|
|
end,
|
|
},
|
|
|
|
|
|
travel_form = {
|
|
id = 783,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 132144,
|
|
|
|
handler = function ()
|
|
shift( "travel_form" )
|
|
end,
|
|
},
|
|
|
|
|
|
typhoon = {
|
|
id = 132469,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
texture = 236170,
|
|
|
|
talent = "balance_affinity",
|
|
|
|
handler = function ()
|
|
if target.distance < 15 then
|
|
applyDebuff( "target", "typhoon" )
|
|
end
|
|
end,
|
|
},
|
|
|
|
|
|
ursols_vortex = {
|
|
id = 102793,
|
|
cast = 0,
|
|
cooldown = 60,
|
|
gcd = "spell",
|
|
|
|
talent = "restoration_affinity",
|
|
|
|
startsCombat = true,
|
|
texture = 571588,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "ursols_vortex" )
|
|
end,
|
|
},
|
|
|
|
|
|
wild_charge = {
|
|
id = function ()
|
|
if buff.bear_form.up then return 16979
|
|
elseif buff.cat_form.up then return 49376
|
|
elseif buff.moonkin_form.up then return 102383 end
|
|
return 102401
|
|
end,
|
|
known = 102401,
|
|
cast = 0,
|
|
cooldown = 15,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
-- texture = 538771,
|
|
|
|
talent = "wild_charge",
|
|
|
|
usable = function () return target.exists and target.distance > 7, "target must be 8+ yards away" end,
|
|
|
|
handler = function ()
|
|
if buff.bear_form.up then target.distance = 5; applyDebuff( "target", "immobilized" )
|
|
elseif buff.cat_form.up then target.distance = 5; applyDebuff( "target", "dazed" ) end
|
|
end,
|
|
|
|
copy = { 49376, 16979, 102401, 102383 }
|
|
},
|
|
|
|
|
|
wild_growth = {
|
|
id = 48438,
|
|
cast = 1.5,
|
|
cooldown = 10,
|
|
gcd = "spell",
|
|
|
|
spend = 0.22,
|
|
spendType = "mana",
|
|
|
|
startsCombat = false,
|
|
texture = 236153,
|
|
|
|
handler = function ()
|
|
applyBuff( "wild_growth" )
|
|
end,
|
|
},
|
|
|
|
|
|
--[[ wrath = {
|
|
id = 5176,
|
|
cast = 1.5,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.01,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 535045,
|
|
|
|
handler = function ()
|
|
if buff.moonkin_form.down then unshift() end
|
|
removeStack( "solar_empowerment" )
|
|
end,
|
|
}, ]]
|
|
} )
|
|
|
|
|
|
spec:RegisterOptions( {
|
|
enabled = true,
|
|
|
|
aoe = 3,
|
|
|
|
nameplates = true,
|
|
nameplateRange = 8,
|
|
|
|
damage = true,
|
|
damageExpiration = 6,
|
|
|
|
potion = "spectral_agility",
|
|
|
|
package = "Guardian",
|
|
} )
|
|
|
|
spec:RegisterSetting( "maul_rage", 20, {
|
|
name = "Excess Rage for |T132136:0|t Maul",
|
|
desc = "If set above zero, the addon will recommend |T132136:0|t Maul only if you have at least this much excess Rage.",
|
|
type = "range",
|
|
min = 0,
|
|
max = 60,
|
|
step = 0.1,
|
|
width = "full"
|
|
} )
|
|
|
|
spec:RegisterSetting( "mangle_more", false, {
|
|
name = "Use |T132135:0|t Mangle More in Multi-Target",
|
|
desc = "If checked, the default priority will recommend |T132135:0|t Mangle more often in |cFFFFD100multi-target|r scenarios. This will generate roughly 15% more Rage and allow for more mitigation (or |T132136:0|t Maul) than otherwise, " ..
|
|
"funnel slightly more damage into your primary target, but will |T134296:0|t Swipe less often, dealing less damage/threat to your secondary targets.",
|
|
type = "toggle",
|
|
width = "full",
|
|
} )
|
|
|
|
spec:RegisterSetting( "ironfur_damage_threshold", 5, {
|
|
name = "Required Damage % for |T1378702:0|t Ironfur",
|
|
desc = "If set above zero, the addon will not recommend |T1378702:0|t Ironfur unless your incoming damage for the past 5 seconds is greater than this percentage of your maximum health.",
|
|
type = "range",
|
|
min = 0,
|
|
max = 100,
|
|
step = 0.1,
|
|
width = "full"
|
|
} )
|
|
|
|
spec:RegisterSetting( "shift_for_convoke", false, {
|
|
name = "|T3636839:0|t Powershift for Convoke the Spirits",
|
|
desc = "If checked and you are a Night Fae, the addon will recommend swapping to your Feral/Balance Affinity specialization before using |T3636839:0|t Convoke the Spirits. " ..
|
|
"This is a DPS gain unless you die horribly.",
|
|
type = "toggle",
|
|
width = "full"
|
|
} )
|
|
|
|
spec:RegisterSetting( "catweave_bear", false, {
|
|
name = "|T132115:0|t Attempt Catweaving (Experimental)",
|
|
desc = function()
|
|
local affinity
|
|
|
|
if state.talent.feral_affinity.enabled then
|
|
affinity = "|cFF00FF00" .. ( GetSpellInfo( 202155 ) ) .. "|r"
|
|
else
|
|
affinity = "|cFFFF0000" .. ( GetSpellInfo( 202155 ) ) .. "|r"
|
|
end
|
|
|
|
return "If checked, the addon will use the experimental |cFFFFD100catweave|r priority included in the default priority pack.\n\nRequires " .. affinity .. "."
|
|
end,
|
|
type = "toggle",
|
|
width = "full",
|
|
} )
|
|
|
|
spec:RegisterSetting( "owlweave_bear", false, {
|
|
name = "|T136036:0|t Attempt Owlweaving (Experimental)",
|
|
desc = function()
|
|
local affinity
|
|
|
|
if state.talent.balance_affinity.enabled then
|
|
affinity = "|cFF00FF00" .. ( GetSpellInfo( 197488 ) ) .. "|r"
|
|
else
|
|
affinity = "|cFFFF0000" .. ( GetSpellInfo( 197488 ) ) .. "|r"
|
|
end
|
|
|
|
return "If checked, the addon will use the experimental |cFFFFD100owlweave|r priority included in the default priority pack.\n\nRequires " .. affinity .. "."
|
|
end,
|
|
type = "toggle",
|
|
width = "full"
|
|
} )
|
|
|
|
spec:RegisterPack( "Guardian", 20211123, [[dCeL8bqiPsEekjSjLQpjvkzukfNsj1QKkLYRKkAwGQUfOsKDrYVOuAyOK6yOqltPupdLQMgOsDnuQSnqL03KkvACOKiNdujSoqLOmpLsUhkAFGkoikjQSqPcpeLKyIGkr1fLkLQpIsIYjLkfTsuIzIssQBIsIQ2jkLFIss1tHQPsP4ROKKSxu9xkgmKdtSyqEmPMSuUmYMPYNbLrtvDArRgLKYRPunBjUnvz3k(nWWLQoUuPWYv55sA6cxhkBxj(oLmEPsvNhfSEPsfZxjz)QAoJCB44njioBBZ6TzKrg3M9QT3M1WvgzhhpyON449I2UaJ44J4rCCwzyY1sz449cdfG042WXRaSttCC)i6RWLzRTWYWhdsPbE2wtpSIejy0N4cBRPN2wooewwIU5WH44njioBBZ6TzKrg3M9QT3M1WvgHBoUGf(GJJJNESkCC)S1OHdXXBuvZXzLHjxlL5rWLFyz7zHnWc5br3JyK9W)OTz92m(S8SWQ4ldmQcx2ZcCPh1nhn46bNe0JyvKWww5bGXEopQ)sWLrs1hTjDpQsrKdShL1hP9jTDQTw9Sax6rDZrdUEWjb9iqFKG5rb4rv)0fpAd4E0aI1pcICGJEeRcywa2jfhVK1OYTHJxyqlNa42WzJrUnCCrhjy44EaWyphJdCECCAeOc14DWdEWXHi542WzJrUnCCAeOc14DWX1xg0LchVRhbH5CkisoJdCEkSEoUOJemCCisoJdCE8GZ22CB440iqfQX7GJRVmOlfoEifAcLpjxyaot4tgRS0u0iqfQ9O9hT5rHuOjuqsrgnzeNlNmyqrJavO2Jw)O9hPbl0itOwOj8z444IosWWX9j5cdWzcFYyLLgp4SXEUnCCAeOc14DWXfDKGHJ7baJlpIJRVmOlfo(MhT5rD9Oi12Zb2J2FuKEKjaMwspcopIXTF0(JGWCofmPi6i1gyyY1szuy9pA9JwT6rBE0rUJQ(cuHE0(JI0JmbW0s6rW5rmU9J2FeeMZPGjfrhP2adtUwkJcR)rRF0AoUMbDHmHCWOOYzJrEWzdU52WXPrGkuJ3bhx0rcgoUhamU8ioU(YGUu44BE0Mh11JIuBphypA)rr6rMayAj9i48ig3(rRF0QvpAZJoYDu1xGk0J2FuKEKjaMwspcopIXTF06hTMJRzqxitihmkQC2yKhC2yh3goUOJemC8twObGvnUJMUddCCAeOc14DWdoBWvUnCCAeOc14DWXfDKGHJZQbcSbgL3zAunYHHQrlLchxFzqxkCCnyHgzc1cnHpdhhFepIJZQbcSbgL3zAunYHHQrlLcp4S1D52WXPrGkuJ3bhx0rcgoEC5yNcg546ld6sHJ31JGWCov)bSkkS(hT)inyHgzc1cnHpdhhVwabhpUCStbJ8GZgRe3gooncuHA8o44IosWWXJlh7uSnhxFzqxkC8UEeeMZP6pGvrH1)O9hPbl0itOwOj8z4441ci44XLJDk2MhC2Gl42WXPrGkuJ3bhxFzqxkCCnyHgzc1cnHpd3J2FeeMZPYrl3ircg1rEso1hbhMpAB4(r7pccZ5u5OLBKibJ6ipjN6J2I5J2MDCCrhjy449Gibdp4SXiR52WXPrGkuJ3bhxFzqxkC8UEu7WYMslHfjlKbIK7r7pQRh1oSSPawflswidejhhx0rcgoUgmla7Kj8jtTpVmQ8GZgJmYTHJtJavOgVdoU(YGUu44BEeeMZPozHgaw14oA6omOW6F0QvpQRhPbl0itOwOj8z4E0AoUOJemCCi6Q0zNhC2yCBUnCCAeOc14DWX1xg0LchFZJGWCo1jl0aWQg3rt3Hbfw)JwT6rD9inyHgzc1cnHpd3JwZXfDKGHJNJwUrIem8GZgJSNBdhNgbQqnEhCC9LbDPWX38iimNtbrxLo7gisofw)JwT6rqyoNkhTCJejymWWKRLYyaod2vbAfw)JwZXfDKGHJdrxLo75aJhC2yeU52WXPrGkuJ3bhxFzqxkC8npQRh1aHsAsFKlKPAjNNPjEcmsfP2EoWE0(J66rIosWOKM0h5czQwY5zAINaJu5yCLeMF8O9hT5rD9Ogiust6JCHmvl58m(KuurQTNdShTA1JAGqjnPpYfYuTKZZ4tsrDKNKt9rW5rS)rRF0QvpQbcL0K(ixit1soptt8eyKQgI2(J26rS)r7pQbcL0K(ixit1soptt8eyK6ipjN6J26rS7r7pQbcL0K(ixit1soptt8eyKksT9CG9O1CCrhjy44st6JCHmvl584bNngzh3gooncuHA8o446ld6sHJdH5Ckysr0rQnWWKRLYOW6F0(JeDKlKHgYlP6J26rSNJl6ibdh3dagxEep4SXiCLBdhNgbQqnEhCCrhjy44H)jvFdejhhxFzqxkC8JChv9fOc9OvREudeQW)KQVbIKtvdrB)rB9i2)OvRE0Mh1aHk8pP6BGi5u1q02F0wpcUF0(JoSHCGdgPkyoNKJdRsnd5bDIMuu3al77P2Jw)OvREKOJCHm0qEjvFeCy(i4(rRw9iimNtbrxLo7gisofw)J2FeeMZPGORsNDdejN6ipjN6J2I5JGPBpQZhXAf744Ag0fYeYbJIkNng5bNng7UCB440iqfQX7GJRVmOlfo(jWivJCPoJhbNhXiRF0(JQue5aRQ8KbwHmEGJ44IosWWX9KbwH4bNngzL42WXPrGkuJ3bhxFzqxkC8kaRaLtt1JvdSczOdRpsWOOrGku7r7pAZJ28inauAaRrf(Nu9nqKCQJ8KCQpcopI1pA)rAaO0awJYtgyfsDKNKt9rW5rS(rRF0(J28OgiuEaW4YJuh5j5uFeCy(i2)O1pA)rBEeeMZPYrl3ircgdmm5APmgGZGDvGw1awZJ2FeeMZPGORsNDdejNQbSMhT)iimNtbtkIosTbgMCTugvdynpA9Jw)OvREufGvGYPPwafjYczQGYcnHIgbQqnoEobDhwFyshhVcWkq50ulGIezHmvqzHMyFJgaknG1Oc)tQ(giso1rEsov4W6DnauAaRr5jdScPoYtYPchwVMJNtq3H1hM0ZJAPeehNroUOJemCCxHQ(6tCbhpNGUdRpmWkaiPWXzKhC2yeUGBdhNgbQqnEhCC9LbDPWXHWCovoA5gjsWyGHjxlLXaCgSRc0QgWAE0(JGWCofeDv6SBGi5unG18O9hj6ixidnKxs1hbhMpcU54IosWWXRwzpzGi54bNTTzn3gooncuHA8o446ld6sHJdH5CQC0YnsKGrH1)O9hj6ixidnKxs1hT1Jy)J2F0MhbH5CQaacFJmnJUiwQAiA7pcomF02pA9JwT6rBEeeMZPcai8nY0m6IyPW6F0(JGWCovaaHVrMMrxel1rEso1hT1JyuXUhT(rRw9OnpccZ5uvzrGrgnWdsczcvneT9hbhMpI9pA9JwT6rqyoNcIUkD2nqKCkS(hT)irh5czOH8sQ(OTEe754IosWWX9eScp4STnJCB440iqfQX7GJRVmOlfo(MhbH5CQQSiWiJg4bjHmHQgI2(JGdZhX4Jw)O9hT5rqyoNkaGW3itZOlILcR)rRF0(JGWCovoA5gjsWOW6F0(JeDKlKHgYlP6Jy(OT54IosWWX9eScp4ST92CB440iqfQX7GJRVmOlfooeMZPYrl3ircgfw)J2FKOJCHm0qEjvF0wmFe754IosWWX9KbwH4bNTTzp3gooncuHA8o446ld6sHJV5rBE0MhbH5CQaacFJmnJUiwQAiA7pcomF02pA9JwT6rBEeeMZPcai8nY0m6IyPW6F0(JGWCovaaHVrMMrxel1rEso1hT1JyuXUhT(rRw9OnpccZ5uvzrGrgnWdsczcvneT9hbhMpI9pA9Jw)O9hj6ixidnKxs1hT1Jy)JwZXfDKGHJ7jyfEWzBB4MBdhNgbQqnEhCC9LbDPWXfDKlKHgYlP6JGZJyKJl6ibdhp8pP6BGi54bNTTzh3gooncuHA8o446ld6sHJV5rBE0jWOhT1JGly9Jw)O9hj6ixidnKxs1hT1Jy)Jw)OvRE0MhT5rNaJE0wpIvIDpA9J2FKOJCHm0qEjvF0wpI9pA)rHuOjuvawXaCMWNmoWr1qrJavO2JwZXfDKGHJ7jdScXdoBBdx52WXPrGkuJ3bhx0rcgoEpwzHUS7qCC9LbDPWXBGqf(Nu9nqKCQAiA7pcopABoUMbDHmHCWOOYzJrEWzB7Ul3goUOJemC8W)KQVbIKJJtJavOgVdEWzBBwjUnCCAeOc14DWX1xg0Lchx0rUqgAiVKQpARhXEoUOJemCCpbRWdoBBdxWTHJl6ibdhVAL9KbIKJJtJavOgVdEWzJ9SMBdhNgbQqnEhCC9LbDPWXpbgPAKl1z8OTEeCZ6hT)iimNtLhyCyN6ipjN6J26rSwXooUOJemC88aJd74bp44EzKWKibd3goBmYTHJtJavOgVdoU(YGUu445ObE5aZ0epbgzyx9rW5r5bgh2zAINaJmH)rvFqP9O9hbH5CQ8aJd7uh5j5uF0wpI9pQB7r(snioUOJemC88aJd74bNTT52WXPrGkuJ3bhxFzqxkC8qg75a7r7pYNKs4R61XJ26rWv2XXfDKGHJF0qwsHhC2yp3gooncuHA8o446ld6sHJhYyphypA)r(KucFvVoE0wpcUYooUOJemCC3rt3jPM5iy0qNejy4bNn4MBdhNgbQqnEhCC9LbDPWX38OUEu7WYMslHfjlKbIK7r7pQRh1oSSPawflswidej3Jw)OvREKOJCHm0qEjvFeCy(OT54IosWWXjVEGfDgiW04bNn2XTHJtJavOgVdoU(YGUu44Hm2Zb2J2FKpjLWx1RJhT1J6US7r7pkhnWlhyMM4jWid7QpcopI1kgFu32J8jPe(kpP754IosWWXHKZE1Eo8GZgCLBdhNgbQqnEhCC9LbDPWXHWCovf7wYfPyYPg5OJQQbSMhT)iimNtbjN9Q9CunG18O9h5tsj8v964rB9i4kRF0(JYrd8YbMPjEcmYWU6JGZJyTAB29OUTh5tsj8vEs3ZXfDKGHJxXULCrkMCQro6OYdEWX7psd8GKGBdNng52WXPrGkuJ3bhVrv9L9rcgoE3E3tASGApcICGJEKg4bjXJGiy5uvpIvoTM6J6JgWaxYxophw5rIosWuFeykmO44IosWWXTNt7OMP2NxgvEWzBBUnCCAeOc14DWX1xg0LchpKcnHYNKlmaNj8jJvwAkAeOc1E0(J28O2HLnLwclswidej3J2FeeMZP0syCGZtH1)OvREu7WYMcyvSizHmqKCpA)rqyoNYdag75yCGZtH1)OvREeeMZP8aGXEogh48uy9pA)rHuOjuqsrgnzeNlNmyqrJavO2JwZXfDKGHJ7tYfgGZe(KXklnEWzJ9CB440iqfQX7GJRVmOlfooeMZP0syCGZtH1)O9h1oSSP0syrYczGi544IosWWX7pGvHhC2GBUnCCAeOc14DWX1xg0LchVRhbH5CkzyW4aNNcR)r7pAZJ28OUEu7WYMcyvSizHmqKCpA)rD9O2HLnLwclswidej3Jw)O9hT5rD9inyHgzc1KW8dJtOhT(rRF0QvpAZJ28OUEu7WYMcyvSizHmqKCpA)rD9O2HLnLwclswidej3Jw)O9hT5rAWcnYeQjH5hgNqpA)rHuOjuhvdWjrcgJ4C5KbdkAeOc1E06hTMJl6ibdhhIKZ4aNhp4SXoUnCCAeOc14DWX1xg0LchhcZ5uEaWyphJdCEkS(hT)O2HLnfWQyrYczGi5E0(J66rAWcnYeQjH5hgNqCCrhjy44wNe(8GZgCLBdhNgbQqnEhCC9LbDPWXHWCoLham2ZX4aNNcR)r7pQDyztbSkwKSqgisUhT)inyHgzc1KW8dJtioUOJemC8AiNlpIhC26UCB440iqfQX7GJRVmOlfoEfGvGYPP6XQbwHm0H1hjyu0iqfQ9OvREufGvGYPPwafjYczQGYcnHIgbQqnoEobDhwFyshhVcWkq50ulGIezHmvqzHMGJNtq3H1hM0ZJAPeehNroUOJemCCxHQ(6tCbhpNGUdRpmWkaiPWXzKh8GJxyqlNO52WzJrUnCCrhjy44AjmoW5XXPrGkuJ3bp4bhVrobReCB4SXi3gooncuHA8o44nQQVSpsWWX727EsJfu7r0cDm8Oi9Ohf(0JeDaUhL1hjlsweOcP44IosWWXR2XkfdKu95bNTT52WXPrGkuJ3bhx0rcgooRgiWgyuENPr1ihgQgTukCC9LbDPWX76rqyoNQ)awffw)J2FuxpsdwOrMqTqt4ZWXXhXJ44SAGaBGr5DMgvJCyOA0sPWdoBSNBdhNgbQqnEhCCrhjy44XLJDkyKJRVmOlfoExpccZ5u9hWQOW6F0(J66rAWcnYeQfAcFgooETacoEC5yNcg5bNn4MBdhNgbQqnEhCCrhjy44XLJDk2MJRVmOlfoExpccZ5u9hWQOW6F0(J66rAWcnYeQfAcFgooETacoEC5yNIT5bNn2XTHJtJavOgVdoU(YGUu44D9inyHgzc1cnHpd3J2F0MhT5rBEuifAcLpjxyaot4tgRS0u0iqfQ9O9hbH5CkFsUWaCMWNmwzPPW6F06hT)OnpQDyztPLWIKfYarY9OvREu7WYMcyvSizHmqKCpA9J2FuxpccZ5u9hWQOW6F06hTA1J28OnpccZ5uq0vPZUbIKtH1)OvREeeMZPYrl3ircgdmm5APmgGZGDvGwH1)O1pA)rBEuxpQDyztPLWIKfYarY9O9h11JAhw2uaRIfjlKbIK7rRF06hTMJl6ibdhVhejy4bNn4k3gooncuHA8o446ld6sHJ3oSSP0syrYczGi5E0(J66rAWcnYeQfAcFgUhT)iimNtLJwUrIemgyyY1szmaNb7QaTQbSMhT)iimNtbrxLo7gisovdynpA)rBE0MhPbGsdynQW)KQVbIKtDKNKt9rW5rS(r7psdaLgWAuEYaRqQJ8KCQpcopI1pA)rnqO8aGXLhPoYtYP(i4W8rW0Th15JyTIDpA)rNaJE0wpcUz9J2FeeMZPYrl3ircgdmm5APmgGZGDvGw1awZJ2FeeMZPGORsNDdejNQbSMhT)iimNtbtkIosTbgMCTugvdynpA9JwT6rBEeeMZP0syCGZtH1)O9hrdDWy4rW5rBZUhT(rRw9OnpQbc1j2j1rUJQ(cuHE0(JAGqDzV6i3rvFbQqpA9JwT6rBE0HnKdCWifqcFdWzcFYqLgDM2HLnf1nWY(EQ9O9h11JGWCofqcFdWzcFYqLgDM2HLnfw)J2F0MhbH5CkTegh48uy9pA)r0qhmgEeCE02S(rRF0(JGWCoLpjxyaot4tgRS0uh5j5uF0wmFeJS(rRF0QvpAZJ0GfAKju2z4szE0(J0aqPbSgf51dSOZabMM6ipjN6J2I5Jy8r7ps0rUqgAiVKQpARhT9Jw)OvRE0MhbH5CkFsUWaCMWNmwzPPW6F0(JOHoym8i48i4cw)O1pAnhVgxQdoBmYXfDKGHJFyJr0rcgtjRbhVK1WmIhXX1syrYcXdoBDxUnCCAeOc14DWX1xg0LchVDyztPLWIKfYarY9O9hPbl0itOwOj8z4E0(J28OnpsdaLgWAuH)jvFdejN6ipjN6JGZJy9J2FKgaknG1O8KbwHuh5j5uFeCEeRF0(JAGq5baJlpsDKNKt9rWH5JGPBpQZhXAf7E0(Jobg9OTEeCZ6hT)iimNtLJwUrIemgyyY1szmaNb7QaTQbSMhT)iimNtbrxLo7gisovdynpA)rqyoNcMueDKAdmm5APmQgWAE0(Jobg9OTEeCZ6hT)iimNtLJwUrIemgyyY1szmaNb7QaTQbSMhT)iimNtbrxLo7gisovdynpA)rqyoNcMueDKAdmm5APmQgWAE06hTA1J28iimNtPLW4aNNcR)r7pIg6GXWJGZJ2MDpA9JwT6rBEudeQtStQJChv9fOc9O9h1aH6YE1rUJQ(cuHE0(Jobg9OTEeCZ6hT)iimNtLJwUrIemgyyY1szmaNb7QaTQbSMhT)iimNtbrxLo7gisovdynpA)rqyoNcMueDKAdmm5APmQgWAE06hTMJxJl1bNng54IosWWXpSXi6ibJPK1GJxYAygXJ44AjSizH4bNnwjUnCCAeOc14DWX1xg0LchVRh1oSSP0syrYczGi5E0(JGWCoLwcJdCEkSEoEnUuhC2yKJl6ibdh)WgJOJemMswdoEjRHzepIJRLWIKfIhC2Gl42WXPrGkuJ3bhxFzqxkC82HLnfWQyrYczGi5E0(J28OnpsdaLgWAuH)jvFdejN6ipjN6JGZJy9J2FKgaknG1O8KbwHuh5j5uFeCEeRF0(Jobg9OTEeJS7r7pccZ5u5OLBKibJQbSMhT)iimNtbrxLo7gisovdynpA)rqyoNcMueDKAdmm5APmQgWAE06hTA1J28iimNt5baJ9CmoW5PW6F0(JAGqvXgxEK6i3rvFbQqpA9JwT6rBEeeMZP8aGXEogh48uy9pA)rqyoNYNKlmaNj8jJvwAkS(hT(rRw9Onp6WgYboyKciHVb4mHpzOsJot7WYMI6gyzFp1E0(J66rqyoNciHVb4mHpzOsJot7WYMcR)rRF0QvpAZJ0GfAKjutcZpmoHE0(J0aqPbSgLgmla7Kj8jtTpVmQQJ8KCQpAlMpIXhT(rRw9OnpsdwOrMqzNHlL5r7psdaLgWAuKxpWIodeyAQJ8KCQpAlMpIXhT)irh5czOH8sQ(OTE02pA9JwZXRXL6GZgJCCrhjy44h2yeDKGXuYAWXlznmJ4rCCGvXIKfIhC2yK1CB440iqfQX7GJRVmOlfoExpQDyztbSkwKSqgisUhT)iimNt5baJ9CmoW5PW65414sDWzJroUOJemC8dBmIosWykzn44LSgMr8iooWQyrYcXdoBmYi3gooncuHA8o446ld6sHJ3oSSPawflswidej3J2FeeMZP8aGXEogh48uy9C8ACPo4SXihx0rcgo(HngrhjymLSgC8swdZiEehhyvSizH4bNng3MBdhNgbQqnEhC8gv1x2hjy44Dt3JSOh5ll0JyvZGwo5rfcgnn5y4ru3al77P2JKP9iiPiJMEK4C5KbdpsQpsEuifAIhzrpQALH2)r5eGh5baJ9CEKdCEpYYNgAHUhf(0JkmOLtEeeMZ9OS(ijEe4EeevawpA7hvjnhx0rcgo(HngrhjymLSgCC9LbDPWX38Onp6WgYboyKQWGwoPACfIICGzGvsV(kPOUbw23tThT(r7pAZJcPqtOGKImAYioxozWGIgbQqThT(r7pAZJGWCovHbTCs14kef5aZaRKE9vsH1)O1pA)rBEeeMZPkmOLtQgxHOihygyL0RVsQJ8KCQpAlMpA7hT(rR54LSgMr8ioEHbTCcGhC2yK9CB440iqfQX7GJ3OQ(Y(ibdhVB6EKf9iFzHEeRAg0YjpQqWOPjhdpI6gyzFp1EKmTh5OtkpsCUCYGHhj1hjpkKcnXJSOhvTYq7)OCcWJC0jLh5aN3JS8PHwO7rHp9OcdA5KhbH5CpkRpsIhbUhbrfG1J2(rvsZXfDKGHJFyJr0rcgtjRbhxFzqxkC8npAZJoSHCGdgPkmOLtQgxHOihygyL0RVskQBGL99u7rRF0(J28Oqk0ekhDsXioxozWGIgbQqThT(r7pAZJGWCovHbTCs14kef5aZaRKE9vsH1)O1pA)rBEeeMZPkmOLtQgxHOihygyL0RVsQJ8KCQpAlMpA7hT(rR54LSgMr8ioEHbTCIMhC2yeU52WXPrGkuJ3bhVrv9L9rcgoE309ilQBD0JKhnjm)Wj0JKP9il6rnW0TIhzjt8Oa8iTewKSq2cSkwKSqW)izApYIEKVSqpcskYOjBD0jLhjoxozWWJcPqtqn4FeRkFAOf6EKgmla70J0ThL1hH1)il6rvRm0(pkNa8iX5YjdgEKdCEpkapsl14rza)J8PJEKham2Z5roW5P44IosWWXpSXi6ibJPK1GJRVmOlfoELIihyvv1pDHXboJgmla70J2F0MhT5rHuOjuqsrgnzeNlNmyqrJavO2Jw)O9hT5rD9O2HLnLwclswidej3Jw)O9hT5rD9O2HLnfWQyrYczGi5E06hT)OnpsdwOrMqnjm)W4e6r7psdaLgWAuAWSaStMWNm1(8YOQoYtYP(OTy(igF06hTMJxYAygXJ44anywa2jEWzJr2XTHJtJavOgVdoEJQ6l7JemC8UP7rwu36OhjpAsy(HtOhjt7rw0JAGPBfpYsM4rb4rAjSizHSfyvSizHG)rY0EKf9iFzHEeKuKrt26OtkpsCUCYGHhfsHMGAW)iwv(0ql09inywa2PhPBpkRpcR)rw0JQwzO9Fuob4rIZLtgm8ih48EuaEKwQXJYa(h5th9iTeoW59ih48uCCrhjy44h2yeDKGXuYAWXRXL6GZgJCC9LbDPWXRue5aRQQ(PlmoWz0GzbyNE0(J28OnpkKcnHYrNumIZLtgmOOrGku7rRF0(J28OUEu7WYMslHfjlKbIK7rRF0(J28OUEu7WYMcyvSizHmqKCpA9J2F0MhPbl0itOMeMFyCc9O9hPbGsdynknywa2jt4tMAFEzuvh5j5uF0wmFeJpA9JwZXlznmJ4rCCTgmla7ep4SXiCLBdhNgbQqnEhCCrhjy44APumIosWykzn44LSgMr8ioUxgjmjsWWdoBm2D52WXPrGkuJ3bhx0rcgo(HngrhjymLSgC8swdZiEehhIKJh8GJRLWIKfIBdNng52WXfDKGHJ3FaRchNgbQqnEh8GZ22CB440iqfQX7GJRVmOlfoExpccZ5uAjmoW5PW654IosWWX1syCGZJhC2yp3gooncuHA8o446ld6sHJdH5CQ(dyvuy9CCrhjy44NyN4bNn4MBdhNgbQqnEhCC9LbDPWXdPqtO8j5cdWzcFYyLLMIgbQqThT)OUEeeMZP8j5cdWzcFYyLLMcRNJl6ibdh3NKlmaNj8jJvwA8GZg742WXPrGkuJ3bhxFzqxkC82HLnLwclswidejhhx0rcgoo51dSOZabMgp4Sbx52WXPrGkuJ3bhxFzqxkC8giuNyNuh5oQ6lqf6rRw9iAOdgdpARhb3SJJl6ibdh)e7ep4S1D52WXPrGkuJ3bhxFzqxkC8giux2RoYDu1xGk0J2FKg4bbm9GCI6JGdZhb3CCrhjy44x2ZdoBSsCB440iqfQX7GJRVmOlfoE7WYMslHfjlKbIKJJl6ibdhxdMfGDYe(KP2NxgvEWzdUGBdhNgbQqnEhCC9LbDPWX1apiGPhKtuFeCy(i4MJl6ibdh3rhqNaSQbkdIJ7jDVHg6GXaNng5bNngzn3gooncuHA8o446ld6sHJV5rD9Ogiust6JCHmvl58mnXtGrQi12Zb2J2Fuxps0rcgL0K(ixit1soptt8eyKkhJRKW8JhT)OnpQRh1aHsAsFKlKPAjNNXNKIksT9CG9OvREudekPj9rUqMQLCEgFskQJ8KCQpcopI9pA9JwT6rnqOKM0h5czQwY5zAINaJu1q02F0wpI9pA)rnqOKM0h5czQwY5zAINaJuh5j5uF0wpIDpA)rnqOKM0h5czQwY5zAINaJurQTNdShTMJl6ibdhxAsFKlKPAjNhp4SXiJCB440iqfQX7GJRVmOlfoEfGvGYPP6XQbwHm0H1hjyu0iqfQ9O9hrdDWy4rB9i2ZUhTA1JQaScuon1cOirwitfuwOju0iqfQXXZjO7W6dt644vawbkNMAbuKilKPckl0e70qhmg2I9SJJNtq3H1hM0ZJAPeehNroUOJemCCxHQ(6tCbhpNGUdRpmWkaiPWXzKhC2yCBUnCCAeOc14DWX1xg0Lchx0rUqgAiVKQpcopIroUOJemC8Qv2tgisoEWzJr2ZTHJtJavOgVdoU(YGUu44h5oQ6lqf6r7psd8GaMEqor9rB9i2XXfDKGHJFIDIhC2yeU52WXPrGkuJ3bhxFzqxkCCnWdcy6b5e1hT1Jyhhx0rcgoE1)Ogp4bhxdaLgWAQCB4SXi3goUOJemC8EqKGHJtJavOgVdEWzBBUnCCrhjy44qfaOzCyhdCCAeOc14DWdoBSNBdhx0rcgooeDv6SNdmooncuHA8o4bNn4MBdhx0rcgoUCAzitaUJMGJtJavOgVdEWzJDCB44IosWWXljm)OAy1WAW8Oj440iqfQX7GhC2GRCB44IosWWXD5rqfaOXXPrGkuJ3bp4S1D52WXfDKGHJlJMQXjfJwkfooncuHA8o4bNnwjUnCCAeOc14DWX1xg0LchhcZ5uqKCgh48uy9CCrhjy44qxwJsoWmoSJhC2Gl42WXPrGkuJ3bhxFzqxkC8npQbcLhamU8ivKA75a7rRw9irh5czOH8sQ(i48igF06hT)OgiuH)jvFdejNksT9CGXXfDKGHJNJwUrIem8GZgJSMBdhx0rcgooeDv6SZXPrGkuJ3bp4SXiJCB440iqfQX7GJl6ibdhxZGUaIdmP2avKAWXjNJ0HzepIJRzqxaXbMuBGksn4bNng3MBdhx0rcgoowLmzqEvooncuHA8o4bp44anywa2jUnC2yKBdhx0rcgoUham2ZX4aNhhNgbQqnEh8GZ22CB440iqfQX7GJRVmOlfoEifAcLpjxyaot4tgRS0u0iqfQ9O9h11JGWCoLpjxyaot4tgRS0uy9CCrhjy44(KCHb4mHpzSYsJhC2yp3gooncuHA8o446ld6sHJxbyfOCAkxE1WuJlTtkAeOc1E0(JGWCoLlVAyQXL2jfwphx0rcgoUgmla7Kj8jtTpVmQ8GZgCZTHJtJavOgVdoU(YGUu44KUK9vsjddMH6(4rRw9isxY(kPQGICMH6(GJl6ibdhVgY5YJ4bNn2XTHJtJavOgVdoU(YGUu44KUK9vsjddMH6(4rRw9isxY(kPkyJCMH6(GJl6ibdh36KWNhC2GRCB440iqfQX7GJRVmOlfoEifAcLpjxyaot4tgRS0u0iqfQ9O9hbH5CkFsUWaCMWNmwzPPW654IosWWX1GzbyNmHpzQ95LrLhC26UCB440iqfQX7GJRVmOlfoEifAcLpjxyaot4tgRS0u0iqfQ9O9hPbGsdynkFsUWaCMWNmwzPPoYtYP(i48igzhhx0rcgoUgmla7Kj8jtTpVmQ8GZgRe3gooncuHA8o446ld6sHJ31JcPqtO8j5cdWzcFYyLLMIgbQqnoUOJemCCnywa2jt4tMAFEzu5bp44Anywa2jUnC2yKBdhx0rcgoUwcJdCECCAeOc14DWdoBBZTHJtJavOgVdoU(YGUu44HuOju(KCHb4mHpzSYstrJavO2J2FuxpccZ5u(KCHb4mHpzSYstH1ZXfDKGHJ7tYfgGZe(KXklnEWzJ9CB440iqfQX7GJRVmOlfoEfGvGYPPC5vdtnU0oPOrGku7r7pccZ5uU8QHPgxANuy9CCrhjy44AWSaStMWNm1(8YOYdoBWn3gooncuHA8o446ld6sHJhsHMq5tYfgGZe(KXklnfncuHApA)rqyoNYNKlmaNj8jJvwAkSEoUOJemCCnywa2jt4tMAFEzu5bNn2XTHJtJavOgVdoU(YGUu44HuOju(KCHb4mHpzSYstrJavO2J2FKgaknG1O8j5cdWzcFYyLLM6ipjN6JGZJyKDCCrhjy44AWSaStMWNm1(8YOYdoBWvUnCCAeOc14DWX1xg0LchVRhfsHMq5tYfgGZe(KXklnfncuHACCrhjy44AWSaStMWNm1(8YOYdEWXbwflswiUnC2yKBdhNgbQqnEhCC9LbDPWX76rqyoNYdag75yCGZtH1ZXfDKGHJ7baJ9CmoW5XdoBBZTHJtJavOgVdoU(YGUu44HuOju(KCHb4mHpzSYstrJavO2J2FuxpccZ5u(KCHb4mHpzSYstH1ZXfDKGHJ7tYfgGZe(KXklnEWzJ9CB44IosWWXRHCvSdgXXPrGkuJ3bp4Sb3CB440iqfQX7GJRVmOlfoEfGvGYPPC5vdtnU0oPOrGkuJJl6ibdhxdMfGDYe(KP2NxgvEWzJDCB440iqfQX7GJRVmOlfoE7WYMcyvSizHmqKCCCrhjy44KxpWIodeyA8GZgCLBdhNgbQqnEhCC9LbDPWX38OUEudekPj9rUqMQLCEMM4jWivKA75a7r7pQRhj6ibJsAsFKlKPAjNNPjEcmsLJXvsy(XJ2F0Mh11JAGqjnPpYfYuTKZZ4tsrfP2EoWE0QvpQbcL0K(ixit1sopJpjf1rEso1hbNhX(hT(rRw9Ogiust6JCHmvl58mnXtGrQAiA7pARhX(hT)Ogiust6JCHmvl58mnXtGrQJ8KCQpARhXUhT)Ogiust6JCHmvl58mnXtGrQi12Zb2JwZXfDKGHJlnPpYfYuTKZJhC26UCB440iqfQX7GJl6ibdhVInU8ioU(YGUu44h5oQ6lqfIJRzqxitihmkQC2yKhC2yL42WXPrGkuJ3bhx0rcgoUhamU8ioU(YGUu44h5oQ6lqf6rRw9iimNtbtkIosTbgMCTugfwphxZGUqMqoyuu5SXip4SbxWTHJtJavOgVdoU(YGUu44AWcnYeQjH5hgNqpA)rKUK9vsjddMH6(GJl6ibdhVgY5YJ4bNngzn3gooncuHA8o446ld6sHJ31J0GfAKjutcZpmoHE0(JiDj7RKsggmd19bhx0rcgoU1jHpp4SXiJCB440iqfQX7GJRVmOlfo(MhbH5CksxY(kzkyJCkS(hTA1JGWCofPlzFLmvqrofw)JwZXfDKGHJRbZcWozcFYu7ZlJkp4SX42CB440iqfQX7GJRVmOlfo(Mhr6s2xjvoMc2i3JwT6rKUK9vsvbf5md19XJw)OvRE0Mhr6s2xjvoMc2i3J2FeeMZPQHCvSdgziVEGfDE0eMc2iNcR)rR54IosWWXRHCU8iEWzJr2ZTHJl6ibdh36KWNJtJavOgVdEWdEWXxORMGHZ22SEBgznCbJWvoULCtoWQC8UPxp4cQ9igz8rIosW8OswJQ6zHJx7jnNngznCZX7pGllehNvWkEeRmm5APmpcU8dlBplScwXJydSqEq09igzp8pABwVnJplplScwXJyv8LbgvHl7zHvWkEeCPh1nhn46bNe0JyvKWww5bGXEopQ)sWLrs1hTjDpQsrKdShL1hP9jTDQTw9SWkyfpcU0J6MJgC9Gtc6rG(ibZJcWJQ(PlE0gW9ObeRFee5ah9iwfWSaStQNLNfwXJ627EsJfu7rqKdC0J0apijEeeblNQ6rSYP1uFuF0ag4s(Y55Wkps0rcM6JatHb1ZIOJemvv)rAGhKeDY0w750oQzQ95Lr9zr0rcMQQ)inWdsIozARpjxyaot4tgRS0GpDmdPqtO8j5cdWzcFYyLLMIgbQqT9nTdlBkTewKSqgisUDimNtPLW4aNNcRF1Q2HLnfWQyrYczGi52HWCoLham2ZX4aNNcRF1kimNt5baJ9CmoW5PW63dPqtOGKImAYioxozWGIgbQqT1plIosWuv9hPbEqs0jtB7pGvb(0XecZ5uAjmoW5PW63Bhw2uAjSizHmqKCplIosWuv9hPbEqs0jtBHi5moW5bF6y2feMZPKHbJdCEkS(9nB6QDyztbSkwKSqgisU9UAhw2uAjSizHmqKCR330LgSqJmHAsy(HXj061RwTztxTdlBkGvXIKfYarYT3v7WYMslHfjlKbIKB9(gnyHgzc1KW8dJtO9qk0eQJQb4KibJrCUCYGbfncuHARx)Si6ibtv1FKg4bjrNmT16KWh(0XecZ5uEaWyphJdCEkS(92HLnfWQyrYczGi527sdwOrMqnjm)W4e6zr0rcMQQ)inWdsIozABnKZLhbF6ycH5CkpaySNJXbopfw)E7WYMcyvSizHmqKC7AWcnYeQjH5hgNqplIosWuv9hPbEqs0jtBDfQ6RpXfWNoMvawbkNMQhRgyfYqhwFKGrrJavO2QvvawbkNMAbuKilKPckl0ekAeOc1GpNGUdRpmPNh1sjiMmcFobDhwFyGvaqsHjJWNtq3H1hM0XScWkq50ulGIezHmvqzHM4z5zHv8OU9UN0yb1EeTqhdpksp6rHp9irhG7rz9rYIKfbQqQNfrhjyQmR2XkfdKu9FweDKGP2jtBXQKjdYd(r8iMSAGaBGr5DMgvJCyOA0sPaF6y2feMZP6pGvrH1V3LgSqJmHAHMWNH7zr0rcMANmTfRsMmip4RfqWmUCStbJWNoMDbH5CQ(dyvuy97DPbl0itOwOj8z4EweDKGP2jtBXQKjdYd(AbemJlh7uSn8PJzxqyoNQ)awffw)ExAWcnYeQfAcFgUNfrhjyQDY02EqKGb(0XSlnyHgzc1cnHpd3(MnBcPqtO8j5cdWzcFYyLLMIgbQqTDimNt5tYfgGZe(KXklnfw)69nTdlBkTewKSqgisUvRAhw2uaRIfjlKbIKB9ExqyoNQ)awffw)6vR2SbcZ5uq0vPZUbIKtH1VAfeMZPYrl3ircgdmm5APmgGZGDvGwH1VEFtxTdlBkTewKSqgisU9UAhw2uaRIfjlKbIKB961plScwXJyvKWIKLCG9irhjyEujRXJSYs5rq0JozEu6G)rEYaRq2g(Nu9FKC0JaZJ0n4F0jWOhL1hbrfG1JGBwd)J6o0z)rY0EuoA5gjsW8i5Oh1awZJKP9iwzysr0rQFemm5APmpccZ5EuwF0aIhj6ixi4Fe4Eu6G)rwu36OhLZJ0s4aN3JKP9iAOdgdpkRpsGal0J2MDW)iw97rP7rw0J8Lf6rHp9iwDj8FuHGrttogEe1nWY(EQb)JcF6rnccZ5Eujh7u7rb4rz8OS(ObepcR)rY0Een0bJHhL1hjqGf6rBZA4z1VhLUhzrDRJEKDgUuMhjt7rD7E9al6EeeyApsdaLgWAEuwFew)JKP9iAiVKQpso6r54Olb3JcWJ2w9Si6ibtTtM2EyJr0rcgtjRb814sDWKr4hXJyQLWIKfc(0XSDyztPLWIKfYarYT3LgSqJmHAHMWNHBhcZ5u5OLBKibJbgMCTugdWzWUkqRAaRzhcZ5uq0vPZUbIKt1awZ(MnAaO0awJk8pP6BGi5uh5j5uHdR31aqPbSgLNmWkK6ipjNkCy9EdekpayC5rQJ8KCQWHjmDRtwRy3(jWOTGBwVdH5CQC0YnsKGXadtUwkJb4myxfOvnG1SdH5Cki6Q0z3arYPAaRzhcZ5uWKIOJuBGHjxlLr1awZ6vR2aH5CkTegh48uy970qhmgGZ2SB9QvBAGqDIDsDK7OQVavO9giux2RoYDu1xGk06vR2Cyd5ahmsbKW3aCMWNmuPrNPDyztrDdSSVNA7DbH5CkGe(gGZe(KHkn6mTdlBkS(9nqyoNslHXbopfw)on0bJb4SnRxVdH5CkFsUWaCMWNmwzPPoYtYPUftgz96vR2Obl0itOSZWLYSRbGsdynkYRhyrNbcmn1rEso1TyY4UOJCHm0qEjv3A71RwTbcZ5u(KCHb4mHpzSYstH1VtdDWyaoWfSE96NfrhjyQDY02dBmIosWykznGVgxQdMmc)iEetTewKSqWNoMTdlBkTewKSqgisUDnyHgzc1cnHpd3(MnAaO0awJk8pP6BGi5uh5j5uHdR31aqPbSgLNmWkK6ipjNkCy9EdekpayC5rQJ8KCQWHjmDRtwRy3(jWOTGBwVdH5CQC0YnsKGXadtUwkJb4myxfOvnG1SdH5Cki6Q0z3arYPAaRzhcZ5uWKIOJuBGHjxlLr1awZ(jWOTGBwVdH5CQC0YnsKGXadtUwkJb4myxfOvnG1SdH5Cki6Q0z3arYPAaRzhcZ5uWKIOJuBGHjxlLr1awZ6vR2aH5CkTegh48uy970qhmgGZ2SB9QvBAGqDIDsDK7OQVavO9giux2RoYDu1xGk0(jWOTGBwVdH5CQC0YnsKGXadtUwkJb4myxfOvnG1SdH5Cki6Q0z3arYPAaRzhcZ5uWKIOJuBGHjxlLr1awZ61plIosWu7KPTh2yeDKGXuYAaFnUuhmze(r8iMAjSizHGpDm7QDyztPLWIKfYarYTdH5CkTegh48uy9plScwXJy1TkwKSKdShj6ibZJkznEKvwkpcIE0jZJsh8pYtgyfY2W)KQ)JKJEeyEKUb)Jobg9OS(iiQaSEeJSd(h1DOZ(JKP9OC0YnsKG5rYrpQbSMhjt7rSYWKIOJu)iyyY1szEeeMZ9OS(Obeps0rUqQhXQFpkDW)ilQBD0JY5rEaWypNh5aN3JKP9Ok24YJEuwF0rUJQ(cuHG)rS63Js3JSOh5ll0JcF6rS6s4)OcbJMMCm8iQBGL99ud(hf(0JAeeMZ9Oso2P2JcWJY4rz9rdiEewVIv)Eu6EKf1To6r2z4szEKmTh1T71dSO7rqGP9inauAaR5rz9ry9psM2JOH8sQ(i5OhbrfG1J2g(hbUhLUhzrDRJEeBjm)4roHEKmThXQaMfGD6r62JY6JW6vplIosWu7KPTh2yeDKGXuYAaFnUuhmze(r8iMaRIfjle8PJz7WYMcyvSizHmqKC7B2ObGsdynQW)KQVbIKtDKNKtfoSExdaLgWAuEYaRqQJ8KCQWH17NaJ2Ir2TdH5CQC0YnsKGr1awZoeMZPGORsNDdejNQbSMDimNtbtkIosTbgMCTugvdynRxTAdeMZP8aGXEogh48uy97nqOQyJlpsDK7OQVavO1RwTbcZ5uEaWyphJdCEkS(DimNt5tYfgGZe(KXklnfw)6vR2Cyd5ahmsbKW3aCMWNmuPrNPDyztrDdSSVNA7DbH5CkGe(gGZe(KHkn6mTdlBkS(1RwTrdwOrMqnjm)W4eAxdaLgWAuAWSaStMWNm1(8YOQoYtYPUftgxVA1gnyHgzcLDgUuMDnauAaRrrE9al6mqGPPoYtYPUftg3fDKlKHgYlP6wBVE9ZIOJem1ozA7HngrhjymLSgWxJl1btgHFepIjWQyrYcbF6y2v7WYMcyvSizHmqKC7qyoNYdag75yCGZtH1)Si6ibtTtM2EyJr0rcgtjRb8J4rmbwflswi4RXL6GjJWNoMTdlBkGvXIKfYarYTdH5CkpaySNJXbopfw)ZcR4rDt3JSOh5ll0JyvZGwo5rfcgnn5y4ru3al77P2JKP9iiPiJMEK4C5KbdpsQpsEuifAIhzrpQALH2)r5eGh5baJ9CEKdCEpYYNgAHUhf(0JkmOLtEeeMZ9OS(ijEe4EeevawpA7hvj9ZIOJem1ozA7HngrhjymLSgWpIhXSWGwobaF6yUzZHnKdCWivHbTCs14kef5aZaRKE9vsrDdSSVNAR33esHMqbjfz0KrCUCYGbfncuHAR33aH5CQcdA5KQXvikYbMbwj96RKcRF9(gimNtvyqlNunUcrroWmWkPxFLuh5j5u3I52Rx)SWkEu309il6r(Yc9iw1mOLtEuHGrttogEe1nWY(EQ9izApYrNuEK4C5KbdpsQpsEuifAIhzrpQALH2)r5eGh5OtkpYboVhz5tdTq3JcF6rfg0YjpccZ5EuwFKepcCpcIkaRhT9JQK(zr0rcMANmT9WgJOJemMswd4hXJywyqlNOHpDm3S5WgYboyKQWGwoPACfIICGzGvsV(kPOUbw23tT17BcPqtOC0jfJ4C5KbdkAeOc1wVVbcZ5ufg0YjvJRquKdmdSs61xjfw)69nqyoNQWGwoPACfIICGzGvsV(kPoYtYPUfZTxV(zHv8OUP7rwu36OhjpAsy(HtOhjt7rw0JAGPBfpYsM4rb4rAjSizHSfyvSizHG)rY0EKf9iFzHEeKuKrt26OtkpsCUCYGHhfsHMGAW)iwv(0ql09inywa2PhPBpkRpcR)rw0JQwzO9Fuob4rIZLtgm8ih48EuaEKwQXJYa(h5th9ipaySNZJCGZt9Si6ibtTtM2EyJr0rcgtjRb8J4rmbAWSaStWNoMvkICGvvv)0fgh4mAWSaSt7B2esHMqbjfz0KrCUCYGbfncuHAR330v7WYMslHfjlKbIKB9(MUAhw2uaRIfjlKbIKB9(gnyHgzc1KW8dJtODnauAaRrPbZcWozcFYu7ZlJQ6ipjN6wmzC96NfwXJ6MUhzrDRJEK8OjH5hoHEKmThzrpQbMUv8ilzIhfGhPLWIKfYwGvXIKfc(hjt7rw0J8Lf6rqsrgnzRJoP8iX5YjdgEuifAcQb)Jyv5tdTq3J0GzbyNEKU9OS(iS(hzrpQALH2)r5eGhjoxozWWJCGZ7rb4rAPgpkd4FKpD0J0s4aN3JCGZt9Si6ibtTtM2EyJr0rcgtjRb8J4rm1AWSaStWxJl1btgHpDmRue5aRQQ(PlmoWz0GzbyN23SjKcnHYrNumIZLtgmOOrGkuB9(MUAhw2uAjSizHmqKCR330v7WYMcyvSizHmqKCR33Obl0itOMeMFyCcTRbGsdynknywa2jt4tMAFEzuvh5j5u3IjJRx)Si6ibtTtM2QLsXi6ibJPK1a(r8iMEzKWKibZZIOJem1ozA7HngrhjymLSgWpIhXeIK7z5zr0rcMQcIKJjejNXbop4thZUGWCofejNXbopfw)ZIOJemvfejxNmT1NKlmaNj8jJvwAWNoMHuOju(KCHb4mHpzSYstrJavO2(Mqk0ekiPiJMmIZLtgmOOrGkuB9UgSqJmHAHMWNH7zr0rcMQcIKRtM26baJlpcEnd6czc5GrrLjJWNoMB20vKA75aBpspYeatlj4W427qyoNcMueDKAdmm5APmkS(1RwT5i3rvFbQq7r6rMayAjbhg3EhcZ5uWKIOJuBGHjxlLrH1VE9ZIOJemvfejxNmT1dagxEe8Ag0fYeYbJIktgHpDm3SPRi12Zb2EKEKjaMwsWHXTxVA1MJChv9fOcThPhzcGPLeCyC71RFweDKGPQGi56KPTNSqdaRAChnDhgEweDKGPQGi56KPTyvYKb5b)iEetwnqGnWO8otJQromunAPuGpDm1GfAKjul0e(mCplIosWuvqKCDY0wSkzYG8GVwabZ4YXofmcF6y2feMZP6pGvrH1VRbl0itOwOj8z4EweDKGPQGi56KPTyvYKb5bFTacMXLJDk2g(0XSlimNt1FaRIcRFxdwOrMqTqt4ZW9Si6ibtvbrY1jtB7brcg4thtnyHgzc1cnHpd3oeMZPYrl3ircg1rEsov4WCB4EhcZ5u5OLBKibJ6ipjN6wm3MDplIosWuvqKCDY0wnywa2jt4tMAFEzuHpDm7QDyztPLWIKfYarYT3v7WYMcyvSizHmqKCplIosWuvqKCDY0wi6Q0z3arYbF6yUbcZ5uNSqdaRAChnDhguy9Rw1LgSqJmHAHMWNHB9ZIOJemvfejxNmTnhTCJejyGpDm3aH5CQtwObGvnUJMUddkS(vR6sdwOrMqTqt4ZWT(zr0rcMQcIKRtM2crxLo75ad(0XCdeMZPGORsNDdejNcRF1kimNtLJwUrIemgyyY1szmaNb7QaTcRF9ZIOJemvfejxNmTvAsFKlKPAjNh8PJ5MUAGqjnPpYfYuTKZZ0epbgPIuBphy7Dj6ibJsAsFKlKPAjNNPjEcmsLJXvsy(X(MUAGqjnPpYfYuTKZZ4tsrfP2EoWwTQbcL0K(ixit1sopJpjf1rEsov4W(1Rw1aHsAsFKlKPAjNNPjEcmsvdrBFl2V3aHsAsFKlKPAjNNPjEcmsDKNKtDl2T3aHsAsFKlKPAjNNPjEcmsfP2EoWw)Si6ibtvbrY1jtB9aGXLhbF6ycH5Ckysr0rQnWWKRLYOW63fDKlKHgYlP6wS)zr0rcMQcIKRtM2g(Nu9nqKCWRzqxitihmkQmze(0X8i3rvFbQqRw1aHk8pP6BGi5u1q023I9RwTPbcv4Fs13arYPQHOTVfCVFyd5ahmsvWCojhhwLAgYd6enPOUbw23tT1Rwj6ixidnKxsv4WeUxTccZ5uq0vPZUbIKtH1VdH5Cki6Q0z3arYPoYtYPUfty6wNSwXUNfrhjyQkisUozARNmWke8PJ5jWivJCPod4WiR3Rue5aRQ8KbwHmEGJEweDKGPQGi56KPTUcv91N4c4thZkaRaLtt1JvdSczOdRpsWOOrGkuBFZgnauAaRrf(Nu9nqKCQJ8KCQWH17AaO0awJYtgyfsDKNKtfoSE9(MgiuEaW4YJuh5j5uHdt2VEFdeMZPYrl3ircgdmm5APmgGZGDvGw1awZoeMZPGORsNDdejNQbSMDimNtbtkIosTbgMCTugvdynRxVAvfGvGYPPwafjYczQGYcnHIgbQqn4ZjO7W6dt65rTucIjJWNtq3H1hgyfaKuyYi85e0Dy9HjDmRaScuon1cOirwitfuwOj23ObGsdynQW)KQVbIKtDKNKtfoSExdaLgWAuEYaRqQJ8KCQWH1RFweDKGPQGi56KPTvRSNGpDmHWCovoA5gjsWyGHjxlLXaCgSRc0QgWA2HWCofeDv6SBGi5unG1Sl6ixidnKxsv4WeUFweDKGPQGi56KPTEcwb(0XecZ5u5OLBKibJcRFx0rUqgAiVKQBX(9nqyoNkaGW3itZOlILQgI2oCyU96vR2aH5CQaacFJmnJUiwkS(DimNtfaq4BKPz0fXsDKNKtDlgvSB9QvBGWCovvweyKrd8GKqMqvdrBhomz)6vRGWCofeDv6SBGi5uy97IoYfYqd5LuDl2)Si6ibtvbrY1jtB9eSc8PJ5gimNtvLfbgz0apijKju1q02HdtgxVVbcZ5ubae(gzAgDrSuy9R3HWCovoA5gjsWOW63fDKlKHgYlPkZTFweDKGPQGi56KPTEYaRqWNoMqyoNkhTCJejyuy97IoYfYqd5LuDlMS)zr0rcMQcIKRtM26jyf4thZnB2aH5CQaacFJmnJUiwQAiA7WH52RxTAdeMZPcai8nY0m6IyPW63HWCovaaHVrMMrxel1rEso1TyuXU1RwTbcZ5uvzrGrgnWdsczcvneTD4WK9RxVl6ixidnKxs1Ty)6NfrhjyQkisUozAB4Fs13arYbF6yk6ixidnKxsv4W4ZIOJemvfejxNmT1tgyfc(0XCZMtGrBbxW617IoYfYqd5LuDl2VE1QnBobgTfRe7wVl6ixidnKxs1Ty)EifAcvfGvmaNj8jJdCunu0iqfQT(zr0rcMQcIKRtM22JvwOl7oe8Ag0fYeYbJIktgHpDmBGqf(Nu9nqKCQAiA7Wz7NfrhjyQkisUozAB4Fs13arY9Si6ibtvbrY1jtB9eSc8PJPOJCHm0qEjv3I9plIosWuvqKCDY02Qv2tgisUNfrhjyQkisUozABEGXHDWNoMNaJunYL6m2cUz9oeMZPYdmoStDKNKtDlwRy3ZYZIOJemvLxgjmjsWWmpW4Wo4thZC0aVCGzAINaJmSRcN8aJd7mnXtGrMW)OQpO02HWCovEGXHDQJ8KCQBX(UnFPg0ZIOJemvLxgjmjsW0jtBpAilPaF6ygYyphy7(KucFvVo2cUYUNfrhjyQkVmsysKGPtM26oA6oj1mhbJg6Kibd8PJziJ9CGT7tsj8v96yl4k7EweDKGPQ8YiHjrcMozAl51dSOZabMg8PJ5MUAhw2uAjSizHmqKC7D1oSSPawflswidej36vReDKlKHgYlPkCyU9ZIOJemvLxgjmjsW0jtBHKZE1EoWNoMHm2Zb2UpjLWx1RJT6USBphnWlhyMM4jWid7QWH1kg728jPe(kpP7FweDKGPQ8YiHjrcMozABf7wYfPyYPg5OJk8PJjeMZPQy3sUifto1ihDuvnG1SdH5Cki5SxTNJQbSMDFskHVQxhBbxz9EoAGxoWmnXtGrg2vHdRvBZUUnFskHVYt6(NLNfrhjyQknauAaRPYShejyEweDKGPQ0aqPbSMANmTfQaanJd7y4zr0rcMQsdaLgWAQDY0wi6Q0zphyplIosWuvAaO0awtTtM2kNwgYeG7OjEweDKGPQ0aqPbSMANmTTKW8JQHvdRbZJM4zr0rcMQsdaLgWAQDY0wxEeubaAplIosWuvAaO0awtTtM2kJMQXjfJwkLNfrhjyQknauAaRP2jtBHUSgLCGzCyh8PJjeMZPGi5moW5PW6FweDKGPQ0aqPbSMANmTnhTCJejyGpDm30aHYdagxEKksT9CGTALOJCHm0qEjvHdJR3BGqf(Nu9nqKCQi12Zb2ZIOJemvLgaknG1u7KPTq0vPZ(ZIOJemvLgaknG1u7KPTyvYKb5bp5CKomJ4rm1mOlG4atQnqfPgplIosWuvAaO0awtTtM2IvjtgKx9z5zr0rcMQslHfjleZ(dyvEweDKGPQ0syrYc1jtB1syCGZd(0XSlimNtPLW4aNNcR)zr0rcMQslHfjluNmT9e7e8PJjeMZP6pGvrH1)Si6ibtvPLWIKfQtM26tYfgGZe(KXkln4thZqk0ekFsUWaCMWNmwzPPOrGkuBVlimNt5tYfgGZe(KXklnfw)ZIOJemvLwclswOozAl51dSOZabMg8PJz7WYMslHfjlKbIK7zr0rcMQslHfjluNmT9e7e8PJzdeQtStQJChv9fOcTAfn0bJHTGB29Si6ibtvPLWIKfQtM2Ezp8PJzdeQl7vh5oQ6lqfAxd8GaMEqorfomH7NfrhjyQkTewKSqDY0wnywa2jt4tMAFEzuHpDmBhw2uAjSizHmqKCplIosWuvAjSizH6KPTo6a6eGvnqzqW7jDVHg6GXatgHpDm1apiGPhKtuHdt4(zr0rcMQslHfjluNmTvAsFKlKPAjNh8PJ5MUAGqjnPpYfYuTKZZ0epbgPIuBphy7Dj6ibJsAsFKlKPAjNNPjEcmsLJXvsy(X(MUAGqjnPpYfYuTKZZ4tsrfP2EoWwTQbcL0K(ixit1sopJpjf1rEsov4W(1Rw1aHsAsFKlKPAjNNPjEcmsvdrBFl2V3aHsAsFKlKPAjNNPjEcmsDKNKtDl2T3aHsAsFKlKPAjNNPjEcmsfP2EoWw)Si6ibtvPLWIKfQtM26ku1xFIlGpDmRaScuonvpwnWkKHoS(ibJIgbQqTDAOdgdBXE2TAvfGvGYPPwafjYczQGYcnHIgbQqn4ZjO7W6dt65rTucIjJWNtq3H1hgyfaKuyYi85e0Dy9HjDmRaScuon1cOirwitfuwOj2PHoymSf7z3ZIOJemvLwclswOozAB1k7j4thtrh5czOH8sQchgFweDKGPQ0syrYc1jtBpXobF6yEK7OQVavODnWdcy6b5e1Ty3ZIOJemvLwclswOozAB1)Og8PJPg4bbm9GCI6wS7z5zr0rcMQsRbZcWoXulHXboVNfrhjyQkTgmla7uNmT1NKlmaNj8jJvwAWNoMHuOju(KCHb4mHpzSYstrJavO2ExqyoNYNKlmaNj8jJvwAkS(NfrhjyQkTgmla7uNmTvdMfGDYe(KP2Nxgv4thZkaRaLtt5YRgMACPDsrJavO2oeMZPC5vdtnU0oPW6FweDKGPQ0AWSaStDY0wnywa2jt4tMAFEzuHpDmdPqtO8j5cdWzcFYyLLMIgbQqTDimNt5tYfgGZe(KXklnfw)ZIOJemvLwdMfGDQtM2QbZcWozcFYu7ZlJk8PJzifAcLpjxyaot4tgRS0u0iqfQTRbGsdynkFsUWaCMWNmwzPPoYtYPchgz3ZIOJemvLwdMfGDQtM2QbZcWozcFYu7ZlJk8PJzxHuOju(KCHb4mHpzSYstrJavO2ZYZIOJemvvHbTCIMPwcJdCEplplIosWuvfg0YjaMEaWyphJdCEplplIosWuvanywa2jMEaWyphJdCEplIosWuvanywa2PozARpjxyaot4tgRS0GpDmdPqtO8j5cdWzcFYyLLMIgbQqT9UGWCoLpjxyaot4tgRS0uy9plIosWuvanywa2PozARgmla7Kj8jtTpVmQWNoMvawbkNMYLxnm14s7KIgbQqTDimNt5YRgMACPDsH1)Si6ibtvb0GzbyN6KPT1qoxEe8PJjPlzFLuYWGzOUpwTI0LSVsQkOiNzOUpEweDKGPQaAWSaStDY0wRtcF4thtsxY(kPKHbZqDFSAfPlzFLufSroZqDF8Si6ibtvb0GzbyN6KPTAWSaStMWNm1(8YOcF6ygsHMq5tYfgGZe(KXklnfncuHA7qyoNYNKlmaNj8jJvwAkS(NfrhjyQkGgmla7uNmTvdMfGDYe(KP2Nxgv4thZqk0ekFsUWaCMWNmwzPPOrGkuBxdaLgWAu(KCHb4mHpzSYstDKNKtfomYUNfrhjyQkGgmla7uNmTvdMfGDYe(KP2Nxgv4thZUcPqtO8j5cdWzcFYyLLMIgbQqTNLNfrhjyQkGvXIKfIPham2ZX4aNh8PJzxqyoNYdag75yCGZtH1)Si6ibtvbSkwKSqDY0wFsUWaCMWNmwzPbF6ygsHMq5tYfgGZe(KXklnfncuHA7DbH5CkFsUWaCMWNmwzPPW6FweDKGPQawflswOozABnKRIDWONfrhjyQkGvXIKfQtM2QbZcWozcFYu7ZlJk8PJzfGvGYPPC5vdtnU0oPOrGku7zr0rcMQcyvSizH6KPTKxpWIodeyAWNoMTdlBkGvXIKfYarY9Si6ibtvbSkwKSqDY0wPj9rUqMQLCEWNoMB6QbcL0K(ixit1soptt8eyKksT9CGT3LOJemkPj9rUqMQLCEMM4jWivogxjH5h7B6QbcL0K(ixit1sopJpjfvKA75aB1Qgiust6JCHmvl58m(Kuuh5j5uHd7xVAvdekPj9rUqMQLCEMM4jWivneT9Ty)EdekPj9rUqMQLCEMM4jWi1rEso1Ty3EdekPj9rUqMQLCEMM4jWivKA75aB9ZIOJemvfWQyrYc1jtBRyJlpcEnd6czc5GrrLjJWNoMh5oQ6lqf6zr0rcMQcyvSizH6KPTEaW4YJGxZGUqMqoyuuzYi8PJ5rUJQ(cuHwTccZ5uWKIOJuBGHjxlLrH1)Si6ibtvbSkwKSqDY02AiNlpc(0XudwOrMqnjm)W4eAN0LSVskzyWmu3hplIosWuvaRIfjluNmT16KWh(0XSlnyHgzc1KW8dJtODsxY(kPKHbZqDF8Si6ibtvbSkwKSqDY0wnywa2jt4tMAFEzuHpDm3aH5CksxY(kzkyJCkS(vRGWCofPlzFLmvqrofw)6NfrhjyQkGvXIKfQtM2wd5C5rWNoMBiDj7RKkhtbBKB1ksxY(kPQGICMH6(y9QvBiDj7RKkhtbBKBhcZ5u1qUk2bJmKxpWIopActbBKtH1V(zr0rcMQcyvSizH6KPTwNe(8GhCoa]] )
|
|
|
|
|
|
end
|